2017-06-06 102 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