【发布时间】:2021-03-12 02:18:48
【问题描述】:
我是 Spark 的新手,想将嵌套的 JSON 转换为 CSV。示例 JSON:
{"key1": {"key11": "value11","key12": "value12"}, "key2": "value2"}
根据 Stackoverflow 上的一些面包屑,我将 json 读取为:
mySchema = StructType([StructField('key1.key11', StringType(), True), StructField('key1.key12', StringType(), True), StructField('key2', StringType(), True)])
initialDF = spark.read.schema(mySchema).json(inputFile)
但这会读取 key1.key11 和 key1.key12 的空值,如下所示:
我如何在这里获得真正的价值?另外,我的 json 有 3 层嵌套。 我的目标是能够将 JSON 写入以 Key1.Key11 等作为列名的 CSV 文件,如下所示:
initialDF.write.option("header","true").csv("/tmp/output.csv")
还有什么需要注意的吗?
更新: 我将架构更新为:
mySchema1 = StructType([StructField('key1', StructType([StructField('key11', StringType(), True), StructField('key12', StringType(), True)]), True), StructField('key2', StringType(), True)])
这样 Spark 将 Key1 作为结构读取。然后我可以使用 Select 检索该结构中的两个字段:
newDF = initialDF.select("key1.key11", "key1.key12", "key2")
虽然这种方法似乎有效,但如果 json 变得太大(就像我的情况一样),这将不是一个好的解决方案。
【问题讨论】:
-
指定json结构对应的schema。您不必将其展平:
partialSchema = StructType([StructField("key11", StringType(), nullable=True) , StructField("key12", StringType(), nullable=True) ]) actualSchema = StructType([StructField("key1", partialSchema, nullable=True) , StructField("key2", StringType(), nullable=True) ])
标签: json apache-spark pyspark