當我使用數據框GROUPBY這樣的:如何在使用Spark DataFrame groupby時獲取其他列?
df.groupBy(df("age")).agg(Map("id"->"count"))
我只會取得列「年齡」和「計數(ID)」一個數據幀,但在DF,有喜歡的「名」多個欄目。
總之,我希望得到的結果在MySQL中,
「選擇姓名,年齡,年齡從DF組數(ID)」
,我應該怎麼辦時,在Spark中使用groupby?
當我使用數據框GROUPBY這樣的:如何在使用Spark DataFrame groupby時獲取其他列?
df.groupBy(df("age")).agg(Map("id"->"count"))
我只會取得列「年齡」和「計數(ID)」一個數據幀,但在DF,有喜歡的「名」多個欄目。
總之,我希望得到的結果在MySQL中,
「選擇姓名,年齡,年齡從DF組數(ID)」
,我應該怎麼辦時,在Spark中使用groupby?
長話短說一般你必須將原始表格彙總在一起。 Spark SQL遵循與大多數主要數據庫(PostgreSQL,Oracle,MS SQL Server)相同的pre-SQL:1999約定,它不允許在聚合查詢中使用其他列。
因爲對於像聚合計數結果沒有很好定義和行爲往往會在支持這種類型的查詢的系統中有所不同,您可以包括使用任意聚合額外的列如first
或last
。
在某些情況下,您可以使用select
替換agg
與窗口函數和後續where
但取決於上下文它可能會非常昂貴。
好吧......哭泣 – Psychevic
你可以這樣做:
的樣本數據:
name age id
abc 24 1001
cde 24 1002
efg 22 1003
ghi 21 1004
ijk 20 1005
klm 19 1006
mno 18 1007
pqr 18 1008
rst 26 1009
tuv 27 1010
pqr 18 1012
rst 28 1013
tuv 29 1011
df.select("name","age","id").groupBy("name","age").count().show();
輸出:
+----+---+-----+
|name|age|count|
+----+---+-----+
| efg| 22| 1|
| tuv| 29| 1|
| rst| 28| 1|
| klm| 19| 1|
| pqr| 18| 2|
| cde| 24| 1|
| tuv| 27| 1|
| ijk| 20| 1|
| abc| 24| 1|
| mno| 18| 1|
| ghi| 21| 1|
| rst| 26| 1|
+----+---+-----+
一種方式做了GROUPBY後能得到的所有列是使用連接函數上。
feature_group = ['name', 'age']
data_counts = df.groupBy(feature_group).count().alias("counts")
data_joined = df.join(data_counts, feature_group)
data_joined現在將具有包括計數值的所有列。
爲什麼不使用「選擇姓名,年齡,從df組按年齡,名稱」?,只有「按年齡組」選擇許多不同的名稱,但只顯示一個名字 – taigetco
在我的問題中,我只是舉一個簡單的例子。當使用「按年齡分組,名稱」時,顯然會得到與「按年齡分組」不同的結果... – Psychevic