You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:54:19