画像项目中遇到的问题与解决1

文章详细描述了在使用Python进行Spark数据处理时遇到的三个问题及解决方案。第一个问题是尝试将整数类型的标签ID加入列表时未转换为字符串导致TypeError。第二个问题是在将DataFrame写入ES时,没有指定保存模式,引发冲突。第三个问题是在使用date_add函数时参数类型错误。作者提供了修正这些问题的代码片段,并强调了在复杂逻辑下使用DSL而非SQL的优越性。
摘要由CSDN通过智能技术生成

报错一

result_list.append(new_tagsid)
将新的标签id插入到新建的列表中时,没有将新标签的id转换为字符串
报错信息:

	File "/tmp/UserProfile/base/tags_base_class.py", line 61, in tagsid_update_def
		result=','.join(result_list)
	TypeError: sequence item 1: expected str instance, int found

解决:
result_list.append(str(new_tagsid))

报错二

在结果标签写入的时候,没有选择写入方式
	def save_es_def(self,final_result_df:DataFrame,rule_meta:tag_mate_class):
	result_index = 'tfec_userprofile_result'
	final_result_df.write.format('es')\
		.option('es.resource',result_index)\
		.option('es.nodes',rule_meta.esNodes)\
		.option('es.write.operation','upsert')\
		.option('es.mapping.id','userId')\
		.save()

报错信息:

SaveMode is set to ErrorIfExists and index tfec_userprofile_result exists and contains data. Consider changing the SaveMode

解决:

	def save_es_def(self,final_result_df:DataFrame,rule_meta:tag_mate_class):
	result_index = 'tfec_userprofile_result'
	final_result_df.write.format('es')\
		.option('es.resource',result_index)\
		.option('es.nodes',rule_meta.esNodes)\
		.option('es.write.operation','upsert')\
		.option('es.mapping.id','userId')\
		.mode('append')\
		.save()

报错三

finish_time=cur_finish_time.select('userId',F.date_add('days',-1000))
finish_time.show()
	

报错信息

pyspark.sql.utils.AnalysisException: “cannot resolve ‘date_add(days, -1000)’ due to data type mismatch: argument 1 requires date type, however, ‘days’ is of int type.;;\n’Project [userId#17L, date_add(days#18, -1000) AS date_add(days, -1000)#21]\n± Project [memberid#5L AS userId#17L, datediff(current_date(Some(Asia/Shanghai)), cast(format_finishtime#14 as date)) AS days#18]\n ± Project [from_unixtime(finishtime#11L, yyyy-MM-dd, Some(Asia/Shanghai)) AS format_finishtime#14, memberid#5L]\n ± Aggregate [memberid#5L], [memberid#5L, max(finishtime#4L) AS finishtime#11L]\n ± Relation[finishtime#4L,memberid#5L] ElasticsearchRelation(Map(es.resource -> tfec_tbl_orders, es.nodes -> up01:9200, es.read.field.include -> memberid,finishtime),org.apache.spark.sql.SQLContext@7596c39d,None)\n”

解决:

#date_sub传入的第一个参数必须是事件类型	
finish_time=cur_finish_time.select('userId',F.date_add(F.current_date(),-1000))

问题1

在支付方式标签计算的时候,因为SQL语句写的不正确(窗口函数那一块),使相同的id取出了并列的不同的付款方式的值,导致在后面更新数据的时候,使后面的付款方式(30,31,32,33,34,35),比如34覆盖掉前面的31(正确值),最后在es中写入了34(错误值)

解决:
重写SQL语句,先对id和支付方式进行分组聚合,求出每个id对应的每个支付方式的数量(cnt),再使用窗口函数按照id进行分组,按照cnt进行降序排序(rn1).最后取出rn1=1的数据

总结:
如果能用DSL方式去写,尽量使用DSL,使用SQL时,当逻辑较复杂时,代码量较多,一旦出问题就很难看出,而使用DSL时,一旦出问题,系统会提示出问题的地方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值