PySpark如何利用非空列名数组col3生成JSON字符串
解决方案
可以通过动态构建键值对映射的方式,仅借助col3生成目标JSON字符串,核心思路是把col3的列名数组和对应列的值数组转换成Map,再转成JSON。
方法实现(以Spark为例)
Python版本
from pyspark.sql import functions as F df = df.withColumn( "col4", F.to_json( F.map_from_arrays( F.col("col3"), F.transform(F.col("col3"), lambda c: F.col(c)) ) ) )
Scala版本
import org.apache.spark.sql.functions._ val df = df.withColumn( "col4", to_json( map_from_arrays( col("col3"), transform(col("col3"), c => col(c.toString)) ) ) )
代码说明
transform(col3, lambda c: F.col(c)):遍历col3中的每个列名字符串,动态提取对应列的数值,生成一个与col3长度匹配的值数组。map_from_arrays(col3, 值数组):将列名数组和值数组配对,生成一个Map结构(键为列名,值为对应列的内容)。to_json(...):把Map结构转换成标准的JSON字符串。
效果验证
针对你的输入示例,执行后会直接生成期望的col4列:
| col4 |
|---|
| {"post code" : "5678"} |
| {"post code": "7877", "addr": "San jose"} |
为什么之前的struct方法不适用
struct是静态定义的结构,无法根据每行的col3数组动态调整包含的字段;而map_from_arrays是动态构建键值对,完全贴合每行col3的内容,能精准生成仅包含非空列的JSON。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

