dataframe - 将 3 级嵌套字典键值转换为 pyspark 数据帧
问题描述
我有一个看起来像这样的 Pyspark 数据框:
我想在“dic”列中提取那些嵌套字典并将它们转换为 PySpark 数据框。像这样:
此外,每行中的键都会有一些变化,即,某些行可能具有其他行没有的字段。我想包括所有字段,如果记录没有某些字段/键,则该值可以显示为“null”。
请让我知道如何实现这一目标。
谢谢!
解决方案
以下是一些可以帮助您入门的代码:
data = [
("hi", {"Name": "David", "Age": "25", "Location": "New York", "Height": "170", "fields": {"Color": "Blue", "Shape": "Round", "Hobby": {"Dance": "1", "Singing": "2"}, "Skills": {"Coding": "2", "Swimming": "4"}}}, "bye"),
("hi", {"Name": "Helen", "Age": "28", "Location": "New York", "Height": "160", "fields": {"Color": "Blue", "Shape": "Round", "Hobby": {"Dance": "5", "Singing": "6"}}}, "bye"),
]
df = spark.createDataFrame(data, ["greeting", "dic", "farewell"])
res = df.select(
F.col("dic").getItem("Name").alias(str("Name")),
F.col("dic")["Age"].alias(str("Age"))
)
res.show()
+-----+---+
| Name|Age|
+-----+---+
|David| 25|
|Helen| 28|
+-----+---+
res.printSchema()
root
|-- Name: string (nullable = true)
|-- Age: string (nullable = true)
Spark 无法处理多种不同类型的字典值。常规 Python 可以处理具有混合类型的字典键/值。
我们可以运行df.printSchema()
看看 PySpark 是如何解释字典值的:
root
|-- greeting: string (nullable = true)
|-- dic: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
|-- farewell: string (nullable = true)
您的示例数据集混合了字符串和字典值。跑df.select(F.col("dic").getItem("fields")).printSchema()
来看:
root
|-- dic[fields]: string (nullable = true)
可能有一些方法可以解析字符串并将其转换为地图,但这会很昂贵。你可以printSchema
在你的问题中添加一个吗?您可能需要重组数据,这样答案会更容易一些;)