前面已经给大家讲过RDD原理,今天就给大家说说RDD的转换算子有哪些,以便大家理解。
对于转换操作,RDD的所有转换都不会直接计算结果,仅记录作用于RDD上的操作,当遇到动作算子(Action)时才会进行真正计算,理解了转换算子的用途,那么接下来就不能理解哪些是转换算子了,通俗的说只要没有经过聚合或计算的算子,都可以当作转换算子。
常用转换算子
map
- 对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD
- 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应
- 输入分区与输出分区一一对应
案例1:
val a=sc.parallelize(1 to 9)
val b=a.map(x=>x*2)
a.collect
b.collect
解析:将原RDD中每个元素都乘以2来产生一个新的RDD
案例2:
val a=sc.parallelize(List("dog","tiger","pig","cat"))
val b=a.map(x=>(x,1))
b.collect
解析:map把普通RDD变成PairRDD
filter
- 对元素进行过滤,对每个元素应用指定函数,返回值为true的元素保留在新的RDD中
案例:
val a=sc.parallelize(1 to 10)
a.filter(_%2==0).collect
a.filter(_<4).collect
//map&filter
val rdd=sc.parallelize(List(1 to 6))
val mapRdd=rdd.map(_*2)
mapRdd.collect
val filterRdd=mapRdd.filter(_>5)
filterRdd.collect
mapValues
- 原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素,仅适用于PairRDD
案例:
val a=sc.parallelize(List("dog","tiger","lion","cat","panther","eagle"))
val b=a.map(x=>(x.length,x))
b.mapValues("x"+_+"x").collect
//输出结果:
Array((3,xdogx), (5,xtigerx), (4,xlionx), (3,xcatx), (7,xpantherx), (5,xeaglex))
distinct
- 将当前RDD进行去重后,返回一个新的RDD
案例:
val dis = sc.parallelize(List(1,2,3,4,5,6,9,9,2,6))
dis.distinct.collect
//1,2,3,4,5,6,9
reduceByKey(func: (x, y) => v)
- 根据Key值将相同Key的元组的值用func进行计算,返回新的RDD
案例:
val a = sc.parallelize(List("dog", "salmon", "pig"), 3)
val f = a.map(x=>(x.length,x))
f.reduceByKey((a,b)=>(a+b)).collect
或
f.reduceByKey(_+_).collect
//Array[(Int, String)] = Array((6,salmon), (3,dogpig))
groupByKey(): RDD[(K, Iterable[V])]
- 将相同Key的值进行聚集,输出一个(K, Iterable[V])类型的RDD
案例:
val a = sc.<