Spark:使用foldLeft展开DataFrame的JSON列时新列全为NULL的问题
问题解决:Spark JSON展开列返回NULL的修复
问题原因
你代码里get_json_object的路径参数写法错误:Scala普通双引号字符串不会解析${nxtCol}变量,导致实际传入的路径是字面量$.${nxtCol},而非$.uom、$.uom_value这类正确路径,自然提取不到数据,返回NULL。另外,代码还缺少删除原metadata列的步骤,不符合期望输出要求。
修正后的代码
import org.apache.spark.sql.DataFrame import org.apache.spark.sql.functions.{col, get_json_object} def expandJsonStringCols(cols: Seq[String])(df: DataFrame): DataFrame = { // 遍历目标列,逐个从JSON字符串提取字段 val expandedDf = cols.foldLeft(df) { (currentDf, targetCol) => // 用Scala字符串插值生成正确JSON路径,注意$要转义为$$ currentDf.withColumn(targetCol, get_json_object(col("metadata"), s"$$.$targetCol")) } // 删除原metadata列,保留其他列+新增的JSON展开列 expandedDf.drop("metadata") } // 调用示例 df.transform(expandJsonStringCols(Seq("uom", "uom_value", "product_id"))).show()
关键修正点
- 正确使用字符串插值:用
s""包裹路径字符串,同时将JSON路径的$转义为$$(因为Scala插值字符串中$是特殊符号),这样才能生成$.uom这类有效路径。 - 移除原JSON列:通过
drop("metadata")删除输入中的原JSON字符串列,匹配期望的输出结构。
验证效果
修正后,get_json_object能精准定位JSON字段提取对应值,最终输出的DataFrame会保留原id、order_id、barcode列,替换为指定的uom、uom_value、product_id列,完全符合预期结构。
内容的提问来源于stack exchange,提问作者Priyanshu Sharma
相关产品推荐
相关产品推荐

