spark python初学(一)对于reduceByKey的理解

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

reduceByKey的函数是针对具有相同键的二元组。在这里例子中,key=1 和key=3都分别只有一个value =1,即他们的键只有1个,所以他们并不执行匿名函数lambda,所以输出都是(1,1)(3,1)。

而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;


综上 reduceByKey是针对每个具有相同键的值的操作,依次操作。


如果写的不对,希望大家指正。




展开阅读全文

没有更多推荐了,返回首页