PySpark中展开可为嵌套Struct类型的Null列报错求助
解决Spark DataFrame explode时的类型不匹配问题
错误原因
你的代码里otherwise分支传入的是字符串'products.customdimensions',而非Spark列对象,导致CASE WHEN分支返回类型分别是STRUCT<>和STRING,触发类型不匹配错误。另外,F.lit(None).cast(T.StructType())使用了空结构体类型,和实际products.customdimensions的结构不匹配,也会埋下隐患。
修复后的代码
from pyspark.sql import functions as F from pyspark.sql import types as T # 提取products.customdimensions的实际数据类型,确保空值类型与原列一致 custom_dim_type = exploded_hits_product_df.schema['products'].dataType['customdimensions'].dataType exploded_prod_df = ( exploded_hits_product_df .withColumn( 'products_customdimensions', F.when( F.col('products').isNull(), F.lit(None).cast(custom_dim_type) ).otherwise( F.col('products.customdimensions') # 改用列对象引用,而非字符串 ) ) .withColumn("product_cd", F.explode_outer(F.col("products_customdimensions"))) )
更简洁的替代方案
其实无需额外处理Null判断,explode_outer本身支持直接处理Null的数组/结构体列:当products为Null时,products.customdimensions也会是Null,explode_outer会自动生成一行Null结果,完全适配你当前及未来的场景:
exploded_prod_df = exploded_hits_product_df.withColumn( "product_cd", F.explode_outer(F.col("products.customdimensions")) )
内容的提问来源于stack exchange,提问作者Rahul Kumar
相关产品推荐
相关产品推荐

