如何拆分对象列表以分隔pyspark数据框中的列

Posted

技术标签:

【中文标题】如何拆分对象列表以分隔pyspark数据框中的列【英文标题】:How to split a list of objects to separate columns in pyspark dataframe 【发布时间】:2022-01-15 18:01:34 【问题描述】:

我在数据框中有一列作为对象列表(结构数组),例如

column: [key1:value1, key2:value2, key3:value3]

我想将此列拆分为单独的列,键名作为列名,值作为同一行中的列值。 最终结果如

key1:value1, key2:value2, key3:value3

如何在 pyspark 中实现这一点?

例如

创建数据框的样本数据:

my_new_schema = StructType([
    StructField('id', LongType()),
    StructField('countries', ArrayType(StructType([
        StructField('name', StringType()),
        StructField('capital', StringType())
    ])))
])
l = [(1, [
        'name': 'Italy', 'capital': 'Rome',
        'name': 'Spain', 'capital': 'Madrid'
    ])
]
    
dz = spark.createDataFrame(l, schema=my_new_schema)
# we have array of structs:
dz.show(truncate=False)
+---+--------------------------------+
|id |countries                       |
+---+--------------------------------+
|1  |[Italy, Rome, Spain, Madrid]|
+---+--------------------------------+

预期输出:

+---+--------+---------+
|id |Italy   |  Spain  |
+---+------------------+
|1  |Rome    | Madrid  |
+---+--------+---------+

【问题讨论】:

【参考方案1】:

inline countries 数组然后旋转国家name 列:

import pyspark.sql.functions as F

dz1 = dz.selectExpr(
    "id", 
    "inline(countries)"
).groupBy("id").pivot("name").agg(
    F.first("capital")
)

dz1.show()
#+---+-----+------+
#|id |Italy|Spain |
#+---+-----+------+
#|1  |Rome |Madrid|
#+---+-----+------+

【讨论】:

是否有可能在条件下进行旋转。假设该结构是否有另一个属性大陆:欧洲,我想像之前一样旋转国家名称和首都,但前提是大陆值是欧洲。 . 这是可能的吗 @Manojkumar 只需在分组前添加一个过滤器:dz1 = dz.selectExpr("id", "inline(countries)").filter("continent = 'Europe'")...

以上是关于如何拆分对象列表以分隔pyspark数据框中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何提取/拆分数据框中的列表列以分隔唯一列?

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列

Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回

如何以正确的格式以科学记数法显示 PySpark 数据框中的列

拆分pyspark中的列

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框