2016-10-22 122 views
4

我需要將兩列Dataframe轉換爲按列之一分組的列表。我在大熊貓成功地做到了:將pandas轉換爲pyspark表達式

expertsDF = expertsDF.groupby('session', as_index=False).agg(lambda x: x.tolist()) 

但現在我試圖做同樣的事情在pySpark如下:

expertsDF = df.groupBy('session').agg(lambda x: x.collect()) 

,我得到的錯誤:

all exprs should be Column 

我已經嘗試了幾個命令,但我根本無法理解它的正確性。火花dokumentation不包含類似的東西。

它的一個例子輸入是一個數據幀:

session  name 
1   a 
1   b 
2   v 
2   c 

輸出:

session name 
1   [a, b....] 
2   [v, c....] 
+0

可以共享例如數據和預期的輸出嗎? – mtoto

+0

@mtoto是的,完成! – Kratos

+2

試試這個:'from pyspark.sql.functions import *; df.groupBy( '​​會議')。AGG(collect_list( '名稱'))' – MaxU

回答

1

你可以使用reduceByKey()有效地做到這一點:

(df.rdd 
.map(lambda x: (x[0],[x[1]])) 
.reduceByKey(lambda x,y: x+y) 
.toDF(["session", "name"]).show()) 
+-------+------+ 
|session| name| 
+-------+------+ 
|  1|[a, b]| 
|  2|[v, c]| 
+-------+------+ 

數據

df = sc.parallelize([(1, "a"), 
        (1, "b"), 
        (2, "v"), 
        (2, "c")]).toDF(["session", "name"])