在Spark DataFrame 中分組時保留其他欄位
在執行DataFrame groupby 運算時,常常會遇到只接收分組的問題欄和聚合值。如果您需要保留原始 DataFrame 中的其他列,這可能會很不方便。
例如,考慮以下分組:
df.groupBy(df("age")).agg(Map("id" -> "count"))
這將傳回一個僅包含「age」的 DataFrame和「計數(id)」欄位。但是,如果原始 DataFrame 中存在「name」和其他資料列,您可能會想要將它們包含在結果中。
在標準 SQL 中,可以使用以下查詢來實現:
select name, age, count(id) from df group by age
要在 Spark 中複製此行為,您可以將聚合結果與原始表連接。連線的關鍵列應與 groupby 欄位相同。
這是使用 Spark SQL 的範例:
val groupedDf = df.groupBy($"age").agg(count($"id").as("count")) val joinedDf = df.join(groupedDf, Seq("age"), "left")
joinedDf 現在將包含所有原始列以及聚合的「計數」列。
另一種方法是使用任意聚合(例如第一個或最後一個)來包含其他欄位。例如:
val groupedDf = df.groupBy($"age").agg(first($"name").as("name"), count($"id").as("count"))
這將確保「name」列保留在聚合的 DataFrame 中。
雖然這些方法允許您在分組期間檢索其他列,但請務必注意此類查詢通常沒有明確定義,並且可能在不同系統中表現出不同的行為。
以上是在 Spark DataFrame 中分組時如何保留其他欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!