在Spark DataFrame GroupBy 操作中保留附加列
在Spark DataFrame groupBy 查詢中,通常只檢索與群組相關的欄位和聚合。但是,在某些情況下,您可能打算保留群組鍵和聚合函數結果以外的其他欄位。
考慮以下 groupBy 操作:
df.groupBy(df("age")).agg(Map("id" -> "count"))
此查詢將傳回一個 DataFrame只有兩列:「age」和「count(id)」。如果您需要原始 DataFrame 中的其他欄位(例如「名稱」),您可以使用多種方法。
方法 1:將聚合結果與原始資料表連接
一種方法是將 DataFrame 與聚合結果連接起來以擷取遺失的資料列。例如:
val agg = df.groupBy(df("age")).agg(Map("id" -> "count")) val result = df.join(agg, df("age") === agg("age"))
此技術保留了原始 DataFrame 中的所有列,但對於大型資料集效率可能較低。
方法2:使用附加函數進行聚合(第一個/最後一個) )
您也可以使用其他聚合函數(例如第一個或最後一個)在聚合中包含非群組列結果。例如:
df.groupBy(df("age")).agg(Map("id" -> "count", "name" -> "first"))
這將傳回一個包含三列的 DataFrame:「age」、「count(id)」和「first(name)」。
方法3:視窗函數Where過濾器
在某些情況下,您可以利用視窗函數與where濾波器結合來實現所需的結果。但是,這種方法可能會對效能產生影響:
df.select( col("name"), col("age"), count("id").over(Window.partitionBy("age").rowsBetween(Window.unboundedPreceding, Window.currentRow)) ).where(col("name").isNotNull)
透過採用這些技術,您可以在 Spark DataFrame 中執行 groupBy 操作時有效地保留額外的列,從而滿足各種分析要求。
以上是如何在 Spark DataFrame GroupBy 操作中保留附加列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!