PySpark创建含None值条件数组触发TypeError问题咨询
报错原因
pyspark.sql.functions.array 仅接受Spark Column类型作为入参,原生Python的None不是Column对象,因此直接传入会触发类型错误。
Spark的ArrayType原生支持存储null值,不需要修改任何集群或会话配置。你之前尝试lit无效,核心问题是类型不匹配:直接调用lit(None)时Spark会默认将null推断为Void或String类型,和otherwise分支数组元素的Double类型不兼容,导致执行报错。
修复方案
将数组中的原生None替换为lit包装的null,同时显式转换为Double类型,和另一分支的数组元素类型保持一致即可,完整可运行代码如下:
from pyspark.sql import Row from pyspark.sql import SparkSession from pyspark.sql.functions import when, array, lit spark = SparkSession.builder.getOrCreate() df = spark.createDataFrame([ Row(ID=1), Row(ID=2), Row(ID=2), Row(ID=1) ]) value_lit = 0.45 size = 10 df = df.withColumn( "TEST", when( df["ID"] == 2, array([lit(None).cast("double") for _ in range(size)]) ).otherwise( array([lit(value_lit) for _ in range(size)]) ) ) df.show(truncate=False)
其他函数适配性说明
struct:用于生成StructType结构体列,数据结构为带字段名的键值组合,和你需要的顺序数组结构不符,不适用该场景。create_map:用于生成MapType键值映射列,和数组结构完全无关,确实不适用。
代码执行后,ID为2的行TEST列将返回长度为10、全为null的数组,ID为1的行TEST列将返回长度为10、全为0.45的数组,符合预期。
内容的提问来源于stack exchange,提问作者Rick Paddock
相关产品推荐
相关产品推荐

