Spark算子补充<一>

来源:互联网 发布:淘宝网品种销量排行榜 编辑:程序博客网 时间:2024/06/10 22:52

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)    }
原创粉丝点击