2015-12-22 115 views
12

當我使用數據框GROUPBY這樣的:如何在使用Spark DataFrame groupby時獲取其他列?

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

我只會取得列「年齡」和「計數(ID)」一個數據幀,但在DF,有喜歡的「名」多個欄目。

總之,我希望得到的結果在MySQL中,

「選擇姓名,年齡,年齡從DF組數(ID)」

,我應該怎麼辦時,在Spark中使用groupby?

+0

爲什麼不使用「選擇姓名,年齡,從df組按年齡,名稱」?,只有「按年齡組」選擇許多不同的名稱,但只顯示一個名字 – taigetco

+0

在我的問題中,我只是舉一個簡單的例子。當使用「按年齡分組,名稱」時,顯然會得到與「按年齡分組」不同的結果... – Psychevic

回答

11

長話短說一般你必須將原始表格彙總在一起。 Spark SQL遵循與大多數主要數據庫(PostgreSQL,Oracle,MS SQL Server)相同的pre-SQL:1999約定,它不允許在聚合查詢中使用其他列。

因爲對於像聚合計數結果沒有很好定義和行爲往往會在支持這種類型的查詢的系統中有所不同,您可以包括使用任意聚合額外的列如firstlast

在某些情況下,您可以使用select替換agg與窗口函數和後續where但取決於上下文它可能會非常昂貴。

+0

好吧......哭泣 – Psychevic

-2

你可以這樣做:

的樣本數據:

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| 
    +----+---+-----+ 
4

一種方式做了GROUPBY後能得到的所有列是使用連接函數上。

feature_group = ['name', 'age'] 
data_counts = df.groupBy(feature_group).count().alias("counts") 
data_joined = df.join(data_counts, feature_group) 

data_joined現在將具有包括計數值的所有列。

相關問題