You need to enable JavaScript to run this app. Spark中不使用UDF将多列拼接为含键值对的JSON数组列
优惠活动
大模型
产品
解决方案
定价
更多

Spark中不使用UDF将多列拼接为含键值对的JSON数组列

无UDF实现方案

完全可以不依赖UDF达成目标输出,核心思路是先构造结构完全匹配要求的数组类型列,再通过Spark内置的JSON转换函数生成最终字符串值。

实现逻辑

和你之前尝试的方案核心差异在于struct的组装方式:

  • 原方案将三列打包进同一个struct,因此最终生成的是包含所有键值的单个JSON对象
  • 目标方案是将每一列单独包装为一个只含单键的struct,再把这些单键struct组装成数组,最终通过to_json转换时就会生成独立单键对象组成的JSON列表
  • 针对数值类型的列(如count),提前做字符串类型转换,满足所有值存储为字符串的要求

参考实现代码

from pyspark.sql.functions import col, struct, array, to_json

df = df.withColumn(
    "json",
    to_json(
        array(
            # 逐列构造单键struct
            struct(col("origin").alias("origin")),
            struct(col("destination").alias("destination")),
            # 计数列转字符串,匹配值为字符串的要求
            struct(col("count").cast("string").alias("count"))
        )
    )
)

效果匹配验证

用你给出的示例数据执行上述代码,得到的json列输出完全符合预期:

  • toronto对应行的json值:[{"origin":"toronto"},{"destination":"ottawa"},{"count":"5"}]
  • montreal对应行的json值:[{"origin":"montreal"},{"destination":"vancouver"},{"count":"10"}]

注意:每个单元素struct必须显式指定和原列名一致的别名,避免生成的JSON键名和预期不符。


内容的提问来源于stack exchange,提问作者Alexander Witte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 10:36:02