我正在尝试使用pyspark来计算出现次数。
假设我有这样的数据:
data = sc.parallelize([(1,[u'a',u'b',u'd']),
(2,[u'a',u'c',u'd']),
(3,[u'a']) ])
count = sc.parallelize([(u'a',0),(u'b',0),(u'c',0),(u'd',0)])
是否可以计算data
中的出现次数并更新count
?
结果应该像[(u'a',3),(u'b',1),(u'c',1),(u'd',2)]
。
答案 0 :(得分:6)
我会使用Counter
:
>>> from collections import Counter
>>>
>>> data.values().map(Counter).reduce(lambda x, y: x + y)
Counter({'a': 3, 'b': 1, 'c': 1, 'd': 2})
答案 1 :(得分:3)
RDD是不可变的,因此无法更新。相反,您可以根据数据计算计数:
count = (rdd
.flatMap(lambda (k, data): data)
.map(lambda w: (w,1))
.reduceByKey(lambda a, b: a+b))
然后,如果结果适合主主内存,则可以从 count 中随意使用.collect()。
答案 2 :(得分:1)
您不会更新 count
,因为RDD是不可变的。只需运行所需的计算,然后直接保存到您想要的任何变量:
In [17]: data.flatMap(lambda x: x[1]).map(lambda x: (x, 1)).reduceByKey(lambda x, y: x + y).collect()
Out[17]: [('b', 1), ('c', 1), ('d', 2), ('a', 3)]