spark中的算子调用:
1. aggregateByKey算子
def main ( args : Array [ String ] ) : Unit = {
val conf: SparkConf = new SparkConf ( ) . setMaster ( "local" ) . setAppName ( "aggregateByKey" )
val sc: SparkContext = new SparkContext ( conf)
val rdd: RDD[ ( String , Int ) ] = sc. makeRDD ( List ( ( "a" , 1 ) , ( "a" , 2 ) , ( "a" , 3 ) , ( "b" , 4 ) ) , 2 )
val value: RDD[ ( String , ( Int , Int ) ) ] = rdd. aggregateByKey ( ( 0 , 0 ) ) ( ( x, y) = > ( x. _1 + 1 , x. _2 + y) , ( x, y) = > ( x. _1 + y. _1, y. _2 + x. _2) )
value. collect ( ) . foreach ( println)
sc. stop ( )
}
其中aggregateByKey的
-- 第一个参数:第一个value的默认值
-- 第二个参数:在分区内的运算
-- 第三个参数:在分区见的运算
计算目的是: ( 相同的K , ( K 出现的次数,V ) )
2. reduceByKey算子
def main ( args : Array [ String ] ) : Unit = {
val conf: SparkConf = new SparkConf ( ) . setMaster ( "local" ) . setAppName ( "reduceBykey" )
val sc: SparkContext = new SparkContext ( conf)
val rdd: RDD[ ( String , Int ) ] = sc. makeRDD ( List ( ( "a" , 1 ) , ( "a" , 2 ) , ( "a" , 3 ) , ( "b" , 4 ) ) , 2 )
val value: RDD[ ( String , Int ) ] = rdd. reduceByKey ( ( x, y) = > x + y)
value. collect ( ) . foreach ( println)
sc. stop ( )
}
reduceByKey的参数是 -- 分区内与分区间的计算逻辑
计算目的: ( 相同的K , V 的和)
3.f oldByKey算子
def main ( args : Array [ String ] ) : Unit = {
val conf: SparkConf = new SparkConf ( ) . setMaster ( "local" ) . setAppName ( "foldByKey" )
val sc: SparkContext = new SparkContext ( conf)
val rdd: RDD[ ( String , Int ) ] = sc. makeRDD ( List ( ( "a" , 1 ) , ( "a" , 2 ) , ( "a" , 3 ) , ( "b" , 4 ) ) , 2 )
val value: RDD[ ( String , Int ) ] = rdd. foldByKey ( 0 ) ( ( x, y) = > x + y)
value. collect ( ) . foreach ( println)
sc. stop ( )
}
foldByKey的参数列表:
-- 第一个参数:表示我们定义的默认值
-- 第二个参数:表示分区内和分区间的相同逻辑
计算目的: ( 相同的K , V 的和)
4. combineByKey算子
def main ( args : Array [ String ] ) : Unit = {
val conf: SparkConf = new SparkConf ( ) . setMaster ( "local" ) . setAppName ( "combinBykey" )
val sc: SparkContext = new SparkContext ( conf)
val rdd: RDD[ ( String , Int ) ] = sc. makeRDD ( List ( ( "a" , 1 ) , ( "a" , 2 ) , ( "a" , 3 ) , ( "b" , 4 ) ) , 2 )
val value: RDD[ ( String , Int ) ] = rdd. combineByKey ( x = > x, ( x: Int , y: Int ) = > math. max ( x, y) , ( x: Int , y: Int ) = > x + y)
value. foreach ( println)
sc. stop ( )
}
combineByKey算子的参数:
-- 第一个参数:可以将我们定义的默认值转化为其他类型的值
-- 第二个参数:是分区内的逻辑计算
-- 第三个参数:是分区间的逻辑计算
注意:中间要表明类型,因为scala的推断机制无法推断两层,中间产生了断层
计算目的: ( 相同的K , V 的和)
中间多次提到:分区内的逻辑计算和分区间的逻辑计算
说明:
读取数据之后,我们将分为两个分区,分别是0 分区和1 分区
0 分区 1 分区
此时分区内有 此时分区内有
多组数据,第 多组数据,第
一次计算逻辑 一次计算逻辑
就是指这次分 就是指这次分
区的逻辑计算 区的逻辑计算
由于数据量太大
不能一直占用内
存,所以先将数
据落地到此磁盘
依然是两个分区
等全部计算完成,再次分别传输到0 分区和1 分区里面
0 分区 1 分区
此时就是我们说的计算
分区间的逻辑,对两个
分区的数据进行聚合计
算,得出最后结果
reduceBykey算子、aggregateByKey算子、foldByKey算子、combineByKey算子的区别
def main ( args: Array [ String ] ) : Unit = {
val conf: SparkConf = new SparkConf ( ) . setMaster ( "local" ) . setAppName ( "test" )
val sc: SparkContext = new SparkContext ( conf)
val rdd: RDD[ ( String , Int ) ] = sc. makeRDD ( List ( ( "a" , 1 ) , ( "a" , 2 ) , ( "a" , 3 ) , ( "b" , 4 ) ) , 2 )
rdd. reduceByKey ( ( x, y) = > x+ y)
rdd. aggregateByKey ( 0 ) ( ( x, y) = > x+ y, ( x, y) = > x+ y)
rdd. foldByKey ( 0 ) ( ( x, y) = > x+ y)
rdd. combineByKey ( x= > x, ( x: Int , y: Int ) = > x+ y, ( x: Int , y: Int ) = > x+ y)
sc. stop ( )
}
全部都是计算分区间相同K 的V 的和
可以看出他们只是参数不一样,或者代表的意义不一样,在底层源码都是调用了相同的方法