Spark RDD转换算子-Key-Value类型总结(1)

10 篇文章 0 订阅

一、partitionBy算子

将数据按照指定 Partitioner 重新进行分区。Spark 默认的分区器是 HashPartitioner

例子:

  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List(1, 2, 3, 4), 2)

    val mapRDD = rdd.map((_, 1))

    mapRDD.partitionBy(new HashPartitioner(2)).saveAsTextFile("output")

    sc.stop()
  }

二、reduceByKey算子

可以将数据按照相同的 Key 对 Value 进行聚合
reduceByKey的参数为Value的聚合方法

例子:

  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("b", 1)))

    val reduceRDD: RDD[(String, Int)] = rdd.reduceByKey(_ + _)

    reduceRDD.collect().foreach(println)

    sc.stop()
  }

三、groupByKey算子

将数据源的数据根据 key 对 value 进行分组
groupByKey将数据源中的数据,相同的Key数据分在一个组里,形成一个对偶元组,元组中的第一个元素就是Key,元组中第二个元素就是相同的Key的Value集合

例子:

  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("b", 1)))

    val groupRDD: RDD[(String, Iterable[Int])] = rdd.groupByKey()

    groupRDD.collect().foreach(println)

    sc.stop()
  }

四、aggregateByKey算子

将数据根据不同的规则进行分区内计算和分区间计算
aggregateByKey存在函数柯里化,有两个参数列表
第一个参数列表,需要传递一个参数,表示初始值
主要用于当碰见第一个Key的时候,和Value进行分区内计算
第二个参数列表需要传递两个参数,第一个表示分区内计算规则,第二个表示分区间计算规则
aggregateByKey最终的返回类型应该和初始值的类型保持一致

例子:

  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("a", 1)), 2)

    val aggregateRDD: RDD[(String, Int)] = rdd.aggregateByKey(0)((x, y) => math.max(x, y), _ + _)

    aggregateRDD.collect().foreach(println)

    sc.stop()
  }

五、foldByKey算子

当分区内计算规则和分区间计算规则相同时,aggregateByKey 就可以简化为 foldByKey
如果聚合计算时,分区内核分区间的计算规则相同时,可以使用foldByKey
第一个参数列表,需要传递一个参数,表示初始值
主要用于当碰见第一个Key的时候,和Value进行分区内计算
第二个参数列表需要传递一个参数,表示分区内计算规则和分区间计算规则

例子:

  def main(args: Array[String]): Unit = {

    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("a", 1)), 2)

    val foldRDD: RDD[(String, Int)] = rdd.foldByKey(0)(_ + _)

    foldRDD.collect().foreach(println)

    sc.stop()
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值