python - 如何在 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']
解决方案
您可以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]|
# +-----+----------+------+
推荐阅读
- excel - 根据单元格值更改工作表标签颜色?
- node.js - 弹出源文件
- c# - Unity C# 脚本抛出“您尝试实例化的对象为空”错误,但仅当脚本位于预制对象上时
- android - 仅 Android 电子邮件意图 *有时*不发送附件?
- node.js - 使用 MongoDB、express、node 和 react 上传图片
- python - Newspaper3k 的缺点:如何只抓取文章 HTML?Python
- asp.net-core - ASP .NET Core - 在 API 级别拒绝访问,并根据相同的 JWT 声明值在方法级别允许访问
- html - 使用 ngModel 和 ngFor 更新数组
- reactjs - 即使存在依赖关系,如何运行一次 useEffect ?为什么 ESLint 抱怨它?
- php - laravel/php 的 Docusign 实现