Spark读取含字典的JSON,如何显示完整键值对?
问题:Spark读取嵌套JSON后show()仅显示值,如何展示完整键值对?
你遇到的情况是因为Spark将你的JSON解析成了包含结构体(struct)字段的DataFrame,默认的show()可能没有完整展示结构体的键值对内容。下面给你几种可行的解决方法:
方法1:展开结构体字段,直接展示键和值列
如果希望把dict里的键值对拆分成单独的列展示,可以使用select展开结构体:
val mdf = sparkSession.read.option("multiLine","true").json("multi2.json") // 展开dict结构体的所有字段 val expandedDf = mdf.select("dict.*") expandedDf.show(false)
执行后会输出:
+-------+ |key | +-------+ |value1 | |value2 | +-------+
这样就能清晰看到键(列名key)和对应的值。
方法2:将结构体转为JSON字符串,展示完整键值对
如果想保持键值对的完整格式(比如{"key":"value1"}),可以用to_json函数把结构体字段转换成JSON字符串:
import org.apache.spark.sql.functions.to_json val mdf = sparkSession.read.option("multiLine","true").json("multi2.json") val jsonStrDf = mdf.select(to_json($"dict").alias("full_key_value")) jsonStrDf.show(false)
执行后输出:
+-------------------+ |full_key_value | +-------------------+ |{"key":"value1"} | |{"key":"value2"} | +-------------------+
这样就能直接看到完整的键值对格式了。
方法3:调整显示逻辑,确认结构体完整内容
其实默认情况下,show(false)应该会展示结构体的完整结构,只是Spark有时会用简写形式显示。你可以先查看DataFrame的schema确认结构,再针对性展示:
val mdf = sparkSession.read.option("multiLine","true").json("multi2.json") // 先查看schema,确认嵌套结构 mdf.printSchema() // 输出: // root // |-- dict: struct (nullable = true) // | |-- key: string (nullable = true) // 同时展示结构体本身和内部的键值 mdf.select($"dict", $"dict.key").show(false)
执行后会输出:
+----------+-------+ |dict |key | +----------+-------+ |{value1} |value1 | |{value2} |value2 | +----------+-------+
结合schema就能明确dict字段里包含key这个键,对应的值也清晰可见。
内容的提问来源于stack exchange,提问作者More Than Five
相关产品推荐
相关产品推荐

