【问题标题】:How to do an aggregate and transpose in PySpark?如何在 PySpark 中进行聚合和转置?
【发布时间】:2019-11-25 13:14:45
【问题描述】:

我想对非数字字段进行一些聚合,例如 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']

【问题讨论】:

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

标签: python pyspark


【解决方案1】:

您可以在groupby 之后使用pivot() 进行转置。 Spark 还有一个collect_list() 聚合。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多