一。概念
rdd.combineByKey(lambda x:"%d_" %x, lambda a,b:"%s@%s" %(a,b), lambda a,b:"%s$%s" %(a,b))
三個引數(都是函式)
第一個引數:給定一個初始值,用函式生成初始值。
第二個引數:combinbe聚合邏輯。
第三個引數:reduce端聚合邏輯。
二。程式碼
from pyspark.conf import SparkConf from pyspark.context import SparkContext conf = SparkConf().setMaster("local").setAppName("CombineByKey") sc = SparkContext(conf = conf) rdd = sc.parallelize([("A",1),("B",2),("B",3),("B",4),("B",5),("C",1),("A",2)], 2) def f(index,items): print "partitionId:%d" %index for val in items: print val return items rdd.mapPartitionsWithIndex(f).count() combinerRDD = rdd.combineByKey(lambda x:"%d_" %x, lambda a,b:"%s@%s" %(a,b), lambda a,b:"%s$%s" %(a,b)) combinerRDD.foreach(p) groupByKeyRDD.foreach(p) sc.stop()
三。解釋
第一個函式作用於每一個組的第一個元素上,將其變為初始值
第二個函式:一開始a是初始值,b是分組內的元素值,比如A[1_],因為沒有b值所以不能呼叫combine函式,第二組因為函式內元素值是[2_,3]呼叫combine函式後為2_@3,以此類推
第三個函式:reduce端大聚合,把相同的key的資料拉取到一個節點上,然後分組。
四。結果
五。擴充
1.用combinebykey實現groupbykey的邏輯
1.1 combinebykey的三個引數
第一個應該返回一個列表,初始值
第二個函式中的a依賴於第一個函式的返回值
第三個函式的a,b依賴於第二個函式的返回值
1.2 解釋:
1.3 程式碼:
def mergeValue(list1,b): list1.append(b) return list1 def mergeCombiners(list1,list2): list1.extend(list2) return list1 groupByKeyRDD = rdd.combineByKey(lambda a:[a],mergeValue,mergeCombiners)
1.4結果
2.使用combineBykey把相同的key和對應的邏輯相加起來
程式碼:
reduceByKeyRDD = rdd.combineByKey(lambda a:a,lambda a,b:a+b,lambda a,b:a+b)
結果:
持續更新中。。。。,歡迎大家關注我的公眾號LHWorld.