17.partitionBy
将数据按照指定 Partitioner 分区规则重新进行分区。Spark 默认的分区器是 HashPartitioner
方法由pairRDDFunctions提供。
隐式转化(二次编译)rdd中有伴生对象。implicit rddtoPairRDDFunction这样的函数叫隐式函数。
maprdd.partitionBy(new HashPartitioner(2)) .saveAsTextFile("output")
hashPartitioner中参数设置是mod 余数一样分在一起。
如果重分区的分区器和当前 RDD 的分区器一样,底层会判断分区器是不是一样,首先匹配类型和分区数量。会直接返回自己。
//TODO partitionBy
val rdd1 = sc.makeRDD(List(1, 2, 3, 4),2)
//int 转为 tuple类型
val maprdd = rdd1.map((_, 1))
val newrdd=maprdd.partitionBy(new HashPartitioner(2))
val newrdd2=newrdd.partitionBy(new HashPartitioner(2))
Spark 还有其他分区器 ctrl+H可以看子类
abstract Partitioner 下有,HashPartitioner,RangePartitioner,PythonPartitioner。其中PythonPartitioner是private只能运行在特定的包中。可以用的是hash和range。range可以用来排序。
如果想按照自己的方法进行数据分区,自己写一个分区器。match case when那种。之后再看。
18. reduceByKey:相同的 Key 对 Value 进行聚合
scala语言中一般的聚合操作都是两两聚合
//TODO partitionBy
val rdd1 = sc.makeRDD(List(
("a",1), ("a",2),("a", 3), ("b",4)
))
val rddnew = rdd1.reduceByKey((x: Int, y: Int) => {
println(s"x=${x},y=${y}")
x + y
})
rddnew.collect().foreach(println)
输出:
x=1,y=2
x=3,y=3
(a,6)
(b,4)
4不参与运算。如果key只有一个,不参与运算。
19.groupByKey:将数据源的数据根据 key 对 value 进行分组,相同key的数据分在一个组中,形成一个对偶元组,元组第一个元素就是key,第二个元素是相同key的value集合
输出:
(a,CompactBuffer(1, 2, 3))
(b,CompactBuffer(4))
20.aggregateByKey
21.foldByKey
22.combineByKey
23.sortByKey
24.join
25.leftOuterJoin
26.cogroup