首頁 >資料庫 >mysql教程 >如何在 Spark DataFrame GroupBy 之後保留非聚合列?

如何在 Spark DataFrame GroupBy 之後保留非聚合列?

Susan Sarandon
Susan Sarandon原創
2024-12-31 14:33:11350瀏覽

How to Keep Non-Aggregated Columns After a Spark DataFrame GroupBy?

如何在Spark DataFrame GroupBy 中保留非聚合列

使用DataFrame 的groupBy 方法聚合資料時,產生的DataFrame 僅包含該組-按鍵和聚合值。但是,在某些情況下,可能還需要在結果中包含原始 DataFrame 中的非聚合資料列。

Spark SQL 的限制

Spark SQL 如下1999 年之前的 SQL 約定,不允許在聚合查詢中新增附加列。像 count 這樣的聚合在應用於多個列時會產生未明確定義的結果,因此處理此類查詢的不同系統會表現出不同的行為。

解決方案:

要保留非- Spark DataFrame groupBy 中的聚合列,有以下幾個選項:

  1. Join Original DataFrame: 將聚合後的DataFrame 與原始DataFrame連接起來以新增缺少的列。
val aggregatedDf = df.groupBy(df("age")).agg(Map("id" -> "count"))
val joinedDf = aggregatedDf.join(df, Seq("age"), "left")
  1. 使用視窗函數: 使用諸如first 或最後在聚合查詢中包含其他欄位。然而,在某些情況下,這種方法的計算成本可能會很高。
import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy(df("age"))
val aggregatedDf = df.withColumn("name", first(df("name")).over(windowSpec))
  .groupBy(df("age")).agg(Map("id" -> "count"))

以上是如何在 Spark DataFrame GroupBy 之後保留非聚合列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn