PySparkSQL解析嵌套JSON时explode处理struct类型报错如何解决?
报错原因
explode() 仅支持Array或Map类型的入参,你当前对struct结构体类型的pid、Body等字段调用explode,自然触发数据类型不匹配错误。
struct类型不需要使用explode拆解,直接用字段名.*语法即可将子字段全部展开到上层。只有处理数组/Map类型字段的时候,才需要用explode将集合拆分为多行。
正确拆解代码
from pyspark.sql import functions as F # 1. 逐层展开所有struct结构 df_flat = df.select( "pid.*" # 展开根节点下的pid结构体 ).select( "*", # 保留pid下的其他非结构体字段,不需要可以删除 "Body.*" # 展开pid下的Body结构体 ).select( "*", "Vendor.*" # 展开Body下的Vendor结构体 ).select( "*", "RC.*" # 展开Vendor下的RC结构体 ).drop("pid", "Body", "Vendor", "RC") # 可选:删除已经拆解完成不需要的原结构体字段 # 2. 处理Array类型的ID字段(按需替换成你实际的Array字段名) df_final = df_flat.select( "*", F.explode("ID").alias("single_id") # 把ID数组拆成多行,每行对应一个ID值 ).drop("ID") # 导出为CSV df_final.write.option("header", "true").mode("overwrite").csv("./output_result")
调试提示
如果不确定字段类型,可以每执行一次select操作后调用printSchema()查看当前结构,确认字段类型后再做后续处理,避免类型判断错误。
内容的提问来源于stack exchange,提问作者Pikun95
相关产品推荐
相关产品推荐

