通过使用pyspark将列转换为行来解析数据框中的Json字符串列表?

Posted

技术标签:

【中文标题】通过使用pyspark将列转换为行来解析数据框中的Json字符串列表?【英文标题】:Parse list of Json strings in a dataframe by converting the column into rows using pyspark? 【发布时间】:2021-11-17 07:35:55 【问题描述】:
//Input
df = [ 
      ('"id":10, "number" : ["1.1", "1.2", "1.3"]',),
      ('"id":20, "number" : ["2.1", "2.2", "2.3"]',),
       ]

//数据帧中所需的输出

id number
10 1.1
10 1.2
10 1.3
20 2.1
20 2.2
20 2.3

我尝试了 withColumn 但只能将其拆分为 2 列

df.withColumn("n",from_json(col("_1"),Sch)).select("n.*")

如何将第二列拆分为行,并为 pyspark 中的每个数字重复第一列?

任何帮助将不胜感激!蒂亚!

【问题讨论】:

【参考方案1】:

您可以在这里使用explode,例如

from pyspark.sql import functions as F

df.withColumn("n",F.from_json(F.col("_1"),Sch))\
  .select("n.id",F.explode("n.number").alias("number"))

下面包含完整的可重现示例:


from pyspark.sql import functions as F
from pyspark.sql import types as T

df = [ 
      ('"id":10, "number" : ["1.1", "1.2", "1.3"]',),
      ('"id":20, "number" : ["2.1", "2.2", "2.3"]',),
       ]

Sch = T.StructType([
    T.StructField("id",T.IntegerType(),True),
    T.StructField("number",T.ArrayType(T.StringType()),True)
])
df = sparkSession.createDataFrame(df)
df.show()

df.withColumn("n",F.from_json(F.col("_1"),Sch))\
  .select("n.id",F.explode("n.number").alias("number"))\
  .show(truncate=False)

输出

+-------------------------------------------+
|_1                                         |
+-------------------------------------------+
|"id":10, "number" : ["1.1", "1.2", "1.3"]|
|"id":20, "number" : ["2.1", "2.2", "2.3"]|
+-------------------------------------------+

+----+------+
|n.id|number|
+----+------+
|10  |1.1   |
|10  |1.2   |
|10  |1.3   |
|20  |2.1   |
|20  |2.2   |
|20  |2.3   |
+----+------+

让我知道这是否适合你。

【讨论】:

成功了!谢谢你。一项更改:df = spark.createDataFrame(df)

以上是关于通过使用pyspark将列转换为行来解析数据框中的Json字符串列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列中的连接值转置为行

sql 将列数据转换为行

将列转换为行

在没有任何聚合函数的情况下将列数据转换为行

使用R将行转换为列,将列转换为行

SQL 查询将列转换为行