首页 > 解决方案 > 将 3 级嵌套字典键值转换为 pyspark 数据帧

问题描述

我有一个看起来像这样的 Pyspark 数据框:

在此处输入图像描述

我想在“dic”列中提取那些嵌套字典并将它们转换为 PySpark 数据框。像这样:

在此处输入图像描述

此外,每行中的键都会有一些变化,即,某些行可能具有其他行没有的字段。我想包括所有字段,如果记录没有某些字段/键,则该值可以显示为“null”。

请让我知道如何实现这一目标。

谢谢!

标签: dataframeapache-sparkpysparkpartition

解决方案


以下是一些可以帮助您入门的代码:

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在你的问题中添加一个吗?您可能需要重组数据,这样答案会更容易一些;)


推荐阅读