首页 > 解决方案 > 如何在 PySpark 中进行聚合和转置?

问题描述

我想对非数字字段进行一些聚合,例如 collect_list ,然后根据不同的列转置到多个列。

这是一个简单的数据集和我想要的结果。

df = sqlContext.createDataFrame([
    ("John", 'Male', 'GA'),
    ("Mary", "Female", 'GA'),
    ("Alex", "Male", "NY"),
    ("Ana", "Female", "NY"),
    ("Amy", "Female", "NY")   
], ["Name", "gender", "state"])

我可以按以下 2 个字段分组。

(df
 .groupBy('state', 'gender')
 .agg(collect_list('Name'))
).show()
+-----+------+------------------+
|state|gender|collect_list(Name)|
+-----+------+------------------+
|   NY|  Male|            [Alex]|
|   GA|  Male|            [John]|
|   GA|Female|            [Mary]|
|   NY|Female|        [Ana, Amy]|
+-----+------+------------------+

如何根据性别字段将其转换为两个字段?这就是我要找的东西。

state |   male   | female
--------------------------
GA    | ['John'] | ['Mary']
NY    | ['Alex'] | ['Ana', 'Amy']

标签: pythonpyspark

解决方案


您可以pivot()groupby. Spark 也有一个collect_list()聚合。

df.groupBy('state').pivot('gender').agg(F.collect_list('Name')).show()

# +-----+----------+------+
# |state|    Female|  Male|
# +-----+----------+------+
# |   NY|[Ana, Amy]|[Alex]|
# |   GA|    [Mary]|[John]|
# +-----+----------+------+

推荐阅读