接上篇:https://developer.aliyun.com/article/1622516?spm=a2c6h.13148508.setting.27.49764f0eBeHytT
flatMap
我们从HDFS加载一个文件过来
val rdd4 = sc.textFile("hdfs://h121.wzk.icu:9000/wcinput/wordcount.txt") rdd4.collect
执行结果如下图:
我们使用“a”作为分隔符,对这段内容进行分割:
rdd4.flatMap(_.split("a")).collect
执行结果如下图:
mapPartitions
val rdd5 = rdd1.mapPartitions(iter => iter.map(_*2))
执行结果如下
对比 map 和 mapPartitions
上面我们用:
rdd1.map(_*2)
rdd1.mapPartitions(iter => iter.map(_*2))
那么这两种有什么区别呢?
map:每次只处理一条数据
mapPartitions:每次处理一个分区的数据,分区的数据处理完成后,数据才能释放,资源不足时容易OOM
当资源充足时,建议使用 mapPartitions,充分提高处理效率
常见转换算子2
groupBy(func):按照传入函数的返回值进行分组,将key相同的值放入一个迭代器
glom():将每一个分区形成一个数组,形成新的RDD类型RDD[Array[T]]
sample(withReplacement,fraction,seed):采样算子,以指定的随机数种子seed随机抽样出数量为fraction的数据,withReplacenent表示抽出数据是否放回,true则放回,false不放回
distinct([numTasks]):对RDD元素去重后,返回一个新的RDD,可传入numTasks参数改变RDD分区数
coalesce(numPartitions):缩减分区数,没有shuffle
repartition(numPartitions):增加或减少分区数,有shuffle
sortBy(func,[ascending], [numTasks]):使用func对数据进行处理,对处理后的结果进行排序
宽依赖的算子(shuffle):groupBy,distinct、repartition、sortBy
转换算子2测试
group by
val rdd1 = sc.parallelize(1 to 10) val group = rdd1.groupBy(_%3) group.collect
执行的结果如下图:
glom.map
将 RDD 中元素的每10个元素分组
val rdd1 = sc.parallelize(1 to 101) val rdd2 = rdd1.glom.map(_.sliding(10, 10).toArray) rdd2.collect
执行结果如下图:
sample
对数据采样,fraction表示采样的百分比
rdd1.sample(true, 0.2, 2).collect rdd1.sample(false, 0.2, 2).collect rdd1.sample(true, 0.2).collect
执行结果如下图:
distinct
对数据进行去重,我们生成一些随机数,然后对这些数值进行去重。
val random = scala.util.Random val arr = (1 to 20).map(x => random.nextInt(10)) val rdd = sc.makeRDD(arr) rdd.distinct.collect
执行结果如下图:
numSlices
对RDD重分区,我们需要多分一些区出来
val rdd1 = sc.range(1, 1000, numSlices=10) val rdd2 = rdd1.filter(_%2==0) rdd2.getNumPartitions
执行结果如下图:
repartition & coalesce
增加或者减少分区
rdd2.getNumPartitions # repartition 是增加和缩减分区数 val rdd3 = rdd2.repartition(5) # coalesce 是缩减分区数 val rdd4 = rdd2.coalesce(5)
执行结果如下图:
sortBy rdd.sortBy(x => x).collect rdd.sortBy(x => x).collect
执行结果如下:
coalesce & repartition
- repartition:增大或者减少分区数,有shuffle
- coalesce:一般用于减少分区数(此时无shuffle)