报错一
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时,一旦出问题,系统会提示出问题的地方