首页 > 解决方案 > 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

为什么数据框中的所有列都没有按预期显示?

标签: pythondataframeapache-sparkpysparkgroup-by

解决方案


对于 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|
+-------+------------+-------+-------+-------+

推荐阅读