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

