python - 如何在 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,以便将每个键视为单行?
解决方案
您可以从所有数据框列创建数组列,将其展开并展开生成的结构列:
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|
#+----+---+------+
推荐阅读
- c++ - 如何将 QPixmap 设置为空
- c# - XmlMessageFormatter 正在生成正文中全为零的消息
- wkwebview - WKWebView:localStorage 在 window.close 上变为空
- ios - 更改自定义单元格内容视图颜色
- javascript - 谁能给我一些使用自动化 RPA 解决方案工具打开 Chrome 的解决方案?
- ios - MK 方向请求 - 方向线未显示
- android - 如何找到最新的 gradle 版本和包装器
- php - Laravel:前端的 AJAX 查询在 1 个 JSON 变量超过 50,000 - 68,000 个字符长后丢失数据
- c++ - clang-tidy 错误地替换了 typedef 中的模板参数
- sql - 避免存储所有可能的产品配置的排列