首頁 >資料庫 >mysql教程 >使用 groupBy 聚合 Spark DataFrame 中的資料時如何保留所有欄位?

使用 groupBy 聚合 Spark DataFrame 中的資料時如何保留所有欄位?

DDD
DDD原創
2024-12-22 16:27:11460瀏覽

How can I retain all columns when aggregating data in a Spark DataFrame using groupBy?

將多列資料分組聚合

使用 Spark DataFrame 的 groupBy 方法時,可以將特定資料列進行聚合運算來彙總資料。但是,產生的 DataFrame 將僅包含分組列和聚合結果。

要解決此限制並檢索附加列和聚合,請考慮以下解決方案:

使用第一個或最後一個聚合

一種方法是使用first()或last()聚合函數在您的分組資料框中。例如:

df.groupBy(df("age")).agg(Map("name" -> "first", "id" -> "count"))

此查詢將建立一個包含三列的 DataFrame:「age」、「name」和「count(id)」。 「name」欄位包含每個年齡組的第一個值,而「count(id)」欄位包含每個年齡組的「id」值的計數。

加入聚合結果

另一個解決方案是使用分組列作為連接鍵將聚合的 DataFrame 與原始 DataFrame 連接起來。此方法保留原始 DataFrame 中的所有欄位:

val aggregatedDf = df.groupBy(df("age")).agg(Map("id" -> "count"))
val joinedDf = aggregatedDf.join(df, Seq("age"), "left")

產生的 DataFrame「joinedDf」將包含原始 DataFrame 中的所有資料列,以及分組 DataFrame 中的「count(id)」聚合。

使用視窗函數

最後,您也可以使用視窗函數透過附加列來模擬 groupBy 的所需行為。以下是範例:

df.withColumn("rowNum", row_number().over(Window.partitionBy("age")))
.groupBy("age").agg(first("name"), count("id"))
.select("age", "name", "count(id)")

此查詢建立一個視窗函數,為每個年齡組內的每筆記錄指派行號。然後,它使用此行號來檢索每個年齡組中第一次出現的“name”,以及“count(id)”聚合。

方法的選擇取決於特定要求和性能考慮因素您的申請。

以上是使用 groupBy 聚合 Spark DataFrame 中的資料時如何保留所有欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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