【问题标题】:Transform 3 level nested dictionary key values to pyspark dataframe将 3 级嵌套字典键值转换为 pyspark 数据帧
【发布时间】:2020-11-11 04:16:38
【问题描述】:

我有一个如下所示的 Pyspark 数据框:

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

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

请告诉我如何实现这一目标。

谢谢!

【问题讨论】:

  • dic 列中的键是否始终相同? dic 每行数据的结构都一样吗?
  • @Powers 我相信这些行有一些变化
  • 很酷,请随时使用解决方案应该能够处理的一组具有代表性的变体来更新问题。
  • @Powers 我刚刚更新了。

标签: dataframe apache-spark pyspark partition


【解决方案1】:

这里有一些代码可以帮助您入门:

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 吗?您可能需要重组数据,这样答案会更容易一些;)

【讨论】:

  • 我对示例数据进行了更新。抱歉,我写的太匆忙了。
  • 它们都应该是字典值。抱歉,我无法提供真实数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2019-06-18
  • 2020-11-28
相关资源
最近更新 更多