2017-06-06 78 views
2

所以我有一個名爲ngram_df一個火花數據框看起來像這樣Pyspark - 在火花數據框列使用reducebykey即列出

-------------------------------- 
Name | nGrams    | 
--------|--------------------- | 
Alice | [ALI, LIC, ICE]  | 
Alicia | [ALI, LIC, ICI, CIA] | 
-------------------------------- 

我想產生一個字典的形式,如輸出:

ALI: 2, LIC: 2, ICE: 1, ICI: 1, CIA: 1

我一直在試圖打開的n-gram列到RDD,這樣我就可以使用reduceByKey功能

rdd = ngram_df.map(lambda row: row['nGrams']) 
test = rdd.reduceByKey(add).collect() 

但是我得到的錯誤:

ValueError: too many values to unpack

即使使用flatmap沒有幫助,因爲我得到的錯誤:

ValueError: need more than 1 value to unpack

回答

0

這是可能的flatMap和reduceByKey相結合的方法。

rdd = spark.sparkContext.parallelize([('Alice', ['ALI', 'LIC', 'ICE']), ('Alicia', ['ALI', 'LIC', 'ICI', 'CIA'])]) 

result = rdd.flatMap(lambda x: [(y, 1) for y in x[1]]).reduceByKey(lambda x,y: x+y) 

result.collect() 
[('ICI', 1), ('CIA', 1), ('ALI', 2), ('ICE', 1), ('LIC', 2)] 
+0

很好的答案,完美的作品。 – Zilong