【问题标题】:Parse nested JSON in PySpark and convert to csv在 PySpark 中解析嵌套的 JSON 并转换为 csv
【发布时间】: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


【解决方案1】:

如果您读取 json 文件,Spark 会自动为您推断架构。只需执行 spark.read.json(inputFile) 即可,无需手动指定架构。

>>> spark.read.json('test.json').show()
+------------------+------+
|              key1|  key2|
+------------------+------+
|[value11, value12]|value2|
+------------------+------+

>>> spark.read.json('test.json').printSchema()
root
 |-- key1: struct (nullable = true)
 |    |-- key11: string (nullable = true)
 |    |-- key12: string (nullable = true)
 |-- key2: string (nullable = true)

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多