首页 > 解决方案 > 从包含 JSON 数据的数据框创建新的数据框

问题描述

这是我第一次问 SO。我有一个这样的数据框

+----------+----------------------------------+
|        id|                              data|
+----------+----------------------------------+
|     '001'|     '[{"index":1}, {"index": 2}]'|
|     '002'|     '[{"index":3}, {"index": 4}]'|
+----------+----------------------------------+

我需要像这样将它转换为新的 DF

+----------+---------+
|        id|    index|
+----------+---------+
|     '001'|        1|
|     '001'|        2|
|     '002'|        3|
|     '002'|        4|
+----------+---------+

有没有办法做到这一点?谢谢你。

标签: pythonapache-sparkpyspark

解决方案


这是我制定的另一种方法。它涉及各种语句,但是,所有这些语句都可以组合成一个语句以产生所需的输出。

创建名为“df”的初始数据框后,

df.show(5,False)
+---+----------------------------+
|id |data                        |
+---+----------------------------+
|001|[{"index": 1}, {"index": 2}]|
|002|[{"index": 3}, {"index": 4}]|
+---+----------------------------+

df2 = df.select(col('id'),split(df.data,',').alias('list'))

这将创建一个名为“df2”的数据框,该数据框将第二列拆分为数组类型。

df2.show(5,False)
+---+-------------------------------+
|id |list                           |
+---+-------------------------------+
|001|[[{"index": 1},  {"index": 2}]]|
|002|[[{"index": 3},  {"index": 4}]]|
+---+-------------------------------+

然后,运行explode函数, df3 = df2.select(col('id'),explode(df2.list))

df3.show(5,False)
+---+--------------+
|id |col           |
+---+--------------+
|001|[{"index": 1} |
|001| {"index": 2}]|
|002|[{"index": 3} |
|002| {"index": 4}]|
+---+--------------+

紧接着 , df4 = df3.select(col('id'),regexp_extract('col','(\d+)',1).alias('no_only')) 这个转换检查分解列中的数字。

df4.show(5,False)
+---+-------+
|id |no_only|
+---+-------+
|001|1      |
|001|2      |
|002|3      |
|002|4      |
+---+-------+

推荐阅读