python - GroupBy 一个数据框记录并使用 PySpark 显示所有列
问题描述
我有以下数据框
dataframe - columnA, columnB, columnC, columnD, columnE
我想 groupBy columnC 然后考虑 columnE 的最大值
dataframe .select('*').groupBy('columnC').max('columnE')
预期产出
dataframe - columnA, columnB, columnC, columnD, columnE
实际输出
dataframe - columnC, columnE
为什么数据框中的所有列都没有按预期显示?
解决方案
对于 Spark 版本 >= 3.0.0,您可以使用max_by选择其他列。
import random
from pyspark.sql import functions as F
#create some testdata
df = spark.createDataFrame(
[[random.randint(1,3)] + random.sample(range(0, 30), 4) for _ in range(10)],
schema=["columnC", "columnB", "columnA", "columnD", "columnE"]) \
.select("columnA", "columnB", "columnC", "columnD", "columnE")
df.groupBy("columnC") \
.agg(F.max("columnE"),
F.expr("max_by(columnA, columnE) as columnA"),
F.expr("max_by(columnB, columnE) as columnB"),
F.expr("max_by(columnD, columnE) as columnD")) \
.show()
对于测试数据
+-------+-------+-------+-------+-------+
|columnA|columnB|columnC|columnD|columnE|
+-------+-------+-------+-------+-------+
| 25| 20| 2| 0| 2|
| 14| 2| 2| 24| 6|
| 26| 13| 3| 2| 1|
| 5| 24| 3| 19| 17|
| 22| 5| 3| 14| 21|
| 24| 5| 1| 8| 4|
| 7| 22| 3| 16| 20|
| 6| 17| 1| 5| 7|
| 24| 22| 2| 8| 3|
| 4| 14| 1| 16| 11|
+-------+-------+-------+-------+-------+
结果是
+-------+------------+-------+-------+-------+
|columnC|max(columnE)|columnA|columnB|columnD|
+-------+------------+-------+-------+-------+
| 1| 11| 4| 14| 16|
| 3| 21| 22| 5| 14|
| 2| 6| 14| 2| 24|
+-------+------------+-------+-------+-------+
推荐阅读
- javascript - 如何从 JavaScript 执行下载的安装程序
- c - 在 C 语言中取消引用指向指针等的指针的指针
- docker - 无法在 gcloud 上部署容器
- php - 如何减去两个日期并以分钟为单位获得差异 PHP
- google-apps-script - Google 表格自动将自定义范围发送到电子邮件
- javascript - 使用 Create React App 在开发中代理
- php - 如何通过在我的后端页面中循环获取响应数据
- java - 如何在 Spring Security 中使用内置 X-Auth-Token 而不是 Spring Session Http Cookie
- sql-server - 在字符前选择字符串
- python - 为什么在尝试迭代列表时会收到“TypeError: 'numpy.int64' object is not iterable”?