You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:32:38