簡體   English   中英

GroupBy 數據框記錄並使用 PySpark 顯示所有列

[英]GroupBy a dataframe records and display all columns with 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|
+-------+------------+-------+-------+-------+

您想要實現的功能可以通過 WINDOW 功能完成。 不是 groupBy

  • 按 columnC 對數據進行分區
  • 按 desc(等級)對每個分區內的數據進行排序
  • 過濾出你想要的結果。
from pyspark.sql.window import Window
from pyspark.sql.functions import rank
from pyspark.sql.functions import col

windowSpec  = Window.partitionBy("columnC").orderBy(col("columnE").desc())

expectedDf = df.withColumn("rank", rank().over(windowSpec)) \
    .filter(col("rank") == 1)

你可能想重組你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM