本文介绍如何使用 pyspark 正确拼接两个类型为 `array
在 PySpark 中,对 array 类型列执行 concat() 操作时,若任一输入列为 NULL,整个 concat() 表达式将返回 NULL —— 这是 Spark 的三值逻辑行为(NULL 参与运算结果仍为 NULL)。你无法直接用 lit("") 或空字符串作为 coalesce 的备选值,因为 coalesce() 要求所有参数类型严格一致:reference 是 array
✅ 正确做法是:使用 array() 函数生成一个空数组(类型与目标列完全一致),作为 coalesce 的默认值。array() 不带参数时返回空数组,且其类型可由上下文自动推断为与同组非空列一致的 array
以下是完整、可运行的解决方案:
from pyspark.sql import SparkSession
from pyspark.sql.functions import concat, coalesce, array, col
# 示例数据构建(可选,用于验证)
data = [
(1, [{"key": "US", "timestamp": "2025-01-08"}], [{"key": "UK", "timestamp": "2025-01-08"}]),
(2, [{"key": "US", "timestamp": "2025-01-08"}], None),
]
df = spark.createDataFrame(data, "id: int, country: array>, reference: array>")
# ✅ 关键修复:用 array() 提供类型兼容的空数组默认值
result_df = df.select(
"id",
concat(
col("country"),
coalesce(col("reference"), array()) # ← 正确!array() 返回空数组,类型自动匹配
).alias("concatenated_column")
)
result_df.show(truncate=False) 输出结果:
+---+---------------------------------------------+
|id |concatenated_column |
+---+---------------------------------------------+
|1 |[{US, 2025-01-01}, {UK, 2025-01-01}] |
|2 |[{US, 2025-01-01}] |
+---+---------------------------------------------+⚠️ 注意事项:
总结:解决 concat 因 NULL
