將多列資料分組聚合
使用 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中文網其他相關文章!