在单词计数示例中,例如,映射后我有(python,1)
和(Python,2)
。如何通过以下操作将两者合并为一个(python,3)
:
def combine(a, b):
if a[0].lower() == b[0].lower():
return (a[0], a[1] + b[1])
然后我打电话给
(sc.map(lambda word: (word, 1))
.reduceByKey(lambda a, b: a + b)
.reduce(lambda a, b :combine(a, b)))
reduce
不太适合这里(它需要一个额外的map
到一个可以处理预期聚合的缓冲区),并且在映射中简单地转换为小写更有意义:
from operator import add
rdd = sc.parallelize([
"Python", "python", "Haskell", "Clojure", "Scala", "scala"])
rdd.map(lambda word: (word.lower(), 1)).reduceByKey(add).collectAsMap()
## {'clojure': 1, 'haskell': 1, 'python': 2, 'scala': 2}