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
相关产品推荐
相关产品推荐

