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

Scala Spark如何将DataFrame的JSON字符串列转为JSON对象类型

问题原因

你当前看到的[[rename1, false, true], [name2, 100, 200]]只是Spark控制台打印Struct类型数据时的默认展示样式,本质上from_json已经正确解析出了带字段名的结构化对象,只是展示时省略了键名,结构本身没有丢失。另外你代码里还存在一个笔误:定义的schema变量是sch,但from_json传入的参数是sc3,需要先修正这个问题避免schema不匹配。

验证结构有效性

你可以通过以下两种方式确认解析后的结构是完整的:

  • 打印DataFrame schema查看字段结构:
finalDF.printSchema()

可以看到nestedKey列是包含rfn/rv1/v2三个字段的数组结构

  • 直接提取子字段验证取值:
finalDF.select($"nestedKey.rfn").show()

可以正确取出每个数组元素的rfn字段值,说明结构完整。

输出与原格式一致的JSON结构

如果你需要输出带键名的JSON字符串格式,在解析完成后调用to_json方法即可:

import org.apache.spark.sql.types._
import org.apache.spark.sql.functions.{from_json, to_json}

// 定义schema
val sch = ArrayType(
  StructType(Seq(
    StructField("rfn", StringType, nullable = true),
    StructField("rv1", StringType, nullable = true),
    StructField("v2", StringType, nullable = true)
  )), 
  containsNull = true
)

// 先解析为结构化数组,再转成带键名的JSON字符串
val finalDF= myDF.withColumn("nestedKey", to_json(from_json($"nestedKey", sch)))

执行后nestedKey列的输出就和你输入的JSON字符串格式完全一致,保留所有键名。

注意事项

如果你后续需要在Spark内部对JSON内的字段做过滤、关联、计算等操作,直接使用from_json解析出来的结构化列即可,不需要转成JSON字符串,结构化列的操作性能远高于字符串操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:45:04