首页 > 解决方案 > 如何在 JSON 中读取,以便 dict/hash 的每个元素都是数据框中的新行?

问题描述

我正在尝试将用 JSON 编写的大型数据集读入数据框。

此数据框的最小工作示例:

{"X":{"sex":"Male","age":57,"BMI":"19.7"},"XX":{"BMI":"30.7","age":44,"sex":"Female"},"XXX":{"age":18,"sex":"Female","BMI":"22.3"},"XXXX":{"sex":"Male","age":29,"BMI":"25.7"},"ZZZ":{"sex":"Male","age":61,"BMI":"40.5"}}

但是,数据集没有被正确读取,因为它应该有大约 10,999 个元素,而我只得到 1 个。

JSON 是一个哈希/字典,其中每个元素都应该是一个新行。

我试过了

df = spark.read.option.json("dbfs:/FileStore/shared_uploads/xyz/data.json")

df = spark.read.option("multiline", "true").json("dbfs:/FileStore/shared_uploads/xyz/data.json")

我也尝试过inferSchema,但这并不能正确解释架构:我仍然得到 1 行。

并制作了一个自定义模式,其中每个字段都是每一行的子键。

例如

custom_schema = StructType([
    StructField('Admission_Date', StringType(), True),
    StructField('BMI', StringType(), True),
    StructField('age', IntegerType(), True),
    StructField('latest_date', StringType(), True),...
...
    StructField('sex', StringType(), True),True)
])

然后使用自定义架构加载:

df = spark.read.option("multiline", "true").schema(custom_schema).json("dbfs:/FileStore/shared_uploads/xyz/data.json")

但这产生了一行。

如何加载此 JSON,以便将每个键视为单行?

标签: pythonjsonapache-sparkpyspark

解决方案


您可以从所有数据框列创建数组列,将其展开并展开生成的结构列:

from pyspark.sql import functions as F

df1 = df.select(
    F.explode(F.array(*df.columns)).alias("rows")
).select("rows.*")

df1.show()

#+----+---+------+
#| BMI|age|   sex|
#+----+---+------+
#|19.7| 57|  Male|
#|30.7| 44|Female|
#|22.3| 18|Female|
#|25.7| 29|  Male|
#|40.5| 61|  Male|
#+----+---+------+

推荐阅读