Spark3.0.3给数组内Struct新增字段时报错:'Column'对象不可调用
问题解决:Spark 3.0.3给数组内Struct新增字段
错误原因
withField方法是Spark 3.1.0及以上版本才支持的API,你的环境是Spark 3.0.3,Column对象没有该方法,因此触发TypeError: 'Column' object is not callable错误。
适配Spark 3.0.3的解决方案
利用Spark 3.0支持的transform函数遍历数组元素,结合struct函数重组结构体并新增字段:
方案1:指定原字段(适合字段较少的情况)
from pyspark.sql import functions as F # 给shops数组内的每个Struct元素新增a字段 df = new_df.withColumn( 'state', F.transform( 'shops', lambda elem: F.struct( elem['epoch'].alias('epoch'), elem['request'].alias('request'), F.lit(1).alias('a') ) ) ) df.printSchema()
方案2:自动保留所有原字段(适合字段较多的情况)
无需逐个列举原字段,用elem.*展开所有原有字段后拼接新字段:
from pyspark.sql import functions as F df = new_df.withColumn( 'state', F.transform( 'shops', lambda elem: F.struct( elem.*, F.lit(1).alias('a') ) ) ) df.printSchema()
执行后,新的state字段结构会和原shops一致,且每个Struct元素多了a字段。
内容的提问来源于stack exchange,提问作者Blue Clouds
相关产品推荐
相关产品推荐

