collectAsMap
函数原型
def collectAsMap(): Map[K, V]
功能和collect函数类似。该函数用于Pair RDD,最终返回Map类型的结果,如果RDD中同一个Key中存在多个Value,那么后面的Value将会把前面的Value覆盖,最终得到的结果就是Key唯一,而且对应一个Value
keyby
函数原型
def keyBy[K](f: T => K): RDD[(K, T)]
创建一个pairRDD,而key就是keyBy所指定的
repartition和coalesce
利用repartition和coalesce重分区
val data = spark.sparkContext.textFile("J:\\reference\\temp\\pom.txt")
val size = data.partitions.size
println(s"原分区大小:$size")
//如果重分区的数目大于原来的分区数,那么必须制定shuffle参数为true,否则分区数不变
val rdd1 = data.coalesce(4, true)
val size2 = rdd1.partitions.size
println(s"使用coalesce新分区大小:$size2")
//该函数其实就是coalesce函数第二个参数为true的实现
val rdd2 = data.repartition(5)
val size3 = rdd2.partitions.size
println(s"使用reparation分区大小:$size3")
randomSplit
该函数根据weights权重,将一个RDD切分成多个RDD
val rdd = spark.sparkContext.makeRDD(1 to 10, 10)
//权重参数,权重越大分得数据的几率也就越大,第二个参数10是种子
val splitedRDD = rdd.randomSplit(Array(1.0, 2.0, 3.0, 4.0))
for (elem <- splitedRDD) {
for (e <- elem) {
print(e + " ")
}
println()
}
glom
该函数是将RDD中每一个分区中类型为T的元素转换成Array[T],这样每一个分区就只有一个数组元素
val rdd = spark.sparkContext.makeRDD(1 to 10, 3)
val size = rdd.partitions.size
println(s"原rdd分区大小$size")
//将原rdd的3个分区转化为一个具有三个元素的数组
val rdd2 = rdd.glom()
for (elem <- rdd2) {
for (e <- elem) {
print(e + " ")
}
println()
}
union
//将两个rdd合并不去重
val rdd1 = spark.sparkContext.makeRDD(1 to 2, 1)
val rdd2 = spark.sparkContext.makeRDD(2 to 3, 1)
for (elem <- rdd1.union(rdd2).collect()) {
println(elem)
}
intersection
//返回两个rdd的交集并且区中
//numPartition指定分区
//指定分区函数
val rdd1 = spark.sparkContext.makeRDD(1 to 2, 1)
val rdd2 = spark.sparkContext.makeRDD(2 to 3, 1)
val rdd3 = rdd1.intersection(rdd2, 2)
for (elem <- rdd3.collect()) {
println(elem)
}
println(rdd3.partitions.size)
subtract
该函数类似于intersection,但返回在RDD中出现,并且不在otherRDD中出现的元素,不去重
val rdd1 = spark.sparkContext.makeRDD(Seq(1, 2, 2, 3))
val rdd2 = spark.sparkContext.makeRDD(3 to 4)
val rdd3 = rdd1.subtract(rdd2)
for (elem <- rdd3.collect()) {
println(elem)
}