reduceByKey(func) 是pairRDD的转化操作,目的是合并具有相同键的值。我一直不理解。可能我太笨了,今天突然开窍了。。
# -*- coding:UTF-8 -*-
from __future__ import print_function
from pyspark import SparkContext
from pyspark import SparkConf
conf = SparkConf().setMaster("local").setAppName("chapter4")
sc = SparkContext(conf=conf)
num = sc.parallelize([1, 4, 2, 3, 4, 4, 2, 4])
pairs = num.map(lambda x: (x, 1)) # 针对每个数进行计数1的操作,
print(pairs.collect()) #输出为列表,每个列表中都是一个二元组,key为每个数,value都为1
a = pairs.reduceByKey(lambda x, y: x+y+1) #
b = pairs.reduceByKey(lambda x, y: x+y+2)
c = pairs.reduceByKey(lambda x, y: x+y+3)
print(a.collect())
print(b.collect())
print(c.collect())
输出
[(1, 1), (4, 1), (2, 1), (3, 1), (4, 1), (4, 1), (2, 1), (4, 1)]
[(1, 1), (2, 3), (3, 1), (4, 7)]
[(1, 1), (2, 4), (3, 1), (4, 10)]
[(1, 1), (2, 5), (3, 1), (4, 13)]
pair RDD中包含二元组,所以需要传递的函数应当操作二元组而不是独立的元素 ,所以lambda后面跟的都是x,y
而key=2的二元组对应了两个(2,1)(2,1),value1=1,value2=1,key=4的二元组有4个:(4,1)(4,1)(4,1)(4,1),value1=1,value2=1,value3=1,value4=1。这两个key就会执行lambda函数。
对于a来说,执行x+y+1,这个语句怎么理解呢? --》 对于每个相同的key,其value相加并加1,那么key=2: 就有value1+value2+1 = 1+1+1=3。key=4: 就有value1+value2+1 +value3+1+value4+1= 1+1+1+1+1+1+1=7;
对于b来说,执行x+y+2 --》 对于每个相同的key,其value相加并加2,那么key=2: 就有value1+value2+2 = 1+1+2=5。key=4: 就有value1+value2+2 +value3+2+value4+2= 1+1+2+1+2+1+2=10;
对于c来说,执行x+y+3 --》 对于每个相同的key,其value相加并加3,那么key=2: 就有value1+value2+1 = 1+1+1=3。key=4: 就有value1+value2+3+value3+3+value4+3= 1+1+3+1+3+1+3=13;
如果写的不对,希望大家指正。