python中具有json行类型的PySpark Dataframe列

Posted

技术标签:

【中文标题】python中具有json行类型的PySpark Dataframe列【英文标题】:PySpark Dataframe column with json row type in python 【发布时间】:2021-05-27 20:37:00 【问题描述】:

在 pysparkdataframe (= df) 中,我有一列包含 JSON 条目的“json”。我想拥有所有“RemainingTimes”值并转换为 Pandas 数据框。我用 For_loop 解决了这个问题,但运行速度很慢。

谁能帮帮我?

单个单元格如下所示:

 "RXBatteryCharge": null, "RXBatteryLoad": null, "RXBatteryTime": null, "RemainingTime": [0, 47], "RemoteEnable": [15, 0, 0], "SelectedMap": null, "SignalDoor": false, "SignalFailure": false, "SignalInfo": false, "SpinningSpeed": null, "StandbyState": null, "StartTime": [0, 0], "Status": 5, "TargetTemperature": [-32768, -32768, -32768]

这是我的解决方案:

l1 = []

for i in range(df.count()):
  l = [df.select('json').collect()[i][0]['RemainingTime']]
  l1 = l1.append(l)


df = pd.DataFrame(l1)

【问题讨论】:

df.select('json.RemainingTime').toPandas() 【参考方案1】:

您可以使用from_json 将带有 json 字符串的列解析为结构。然后你可以选择你感兴趣的结构的元素。

from pyspark.sql import functions as F

schema = "RXBatteryCharge string, RXBatteryLoad string, RXBatteryTime timestamp, RemainingTime array<int>, RemoteEnable array<int>, SelectedMap string, SignalDoor boolean, SignalFailure boolean, SignalInfo boolean, SpinningSpeed double, StandbyState string, StartTime array<int>, Status int, TargetTemperature array<int>"

df.withColumn("parsed_json", F.from_json("json", schema)).select("parsed_json.RemainingTime").show()

#+-------------+
#|RemainingTime|
#+-------------+
#|      [0, 47]|
#+-------------+

使用 from_json 时,必须提供与 json 字符串的元素匹配的架构字符串。

【讨论】:

以上是关于python中具有json行类型的PySpark Dataframe列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 从 JSON 文件中获取 Schema

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列

Pyspark 从具有不同列的行/数据创建 DataFrame

在 Pyspark/Hive 中处理不断变化的数据类型

pyspark:删除所有行中具有相同值的列

pyspark 使用模式将 csv 文件加载到数据框中