• Spark算子



    释义

    1. aggregateByKey逻辑类似 aggregate,但 aggregateByKey针对的是PairRDD,即键值对 RDD,所以返回结果也是 PairRDD,结果形式为:(各个Key, 同样Key对应的Value聚合后的值)
    2. aggregateByKey先将每个partition内元素进行分组计算,然后将每个partition的计算结果进行combine,得到最终聚合结果。且最终结果允许跟原始RDD类型不同

    方法签名如下:

    def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U, combOp: (U, U) => U): RDD[(K, U)] = self.withScope {
        ...
    }
    
    • zeroValue: 每个partition的聚合初始值
    • seqOp: sequence operation,对partition内数据进行映射,最终1个partition只有1个结果。输入类型为U跟V,输出为U,即每次操作结果要跟zeroValue类型一致
      • 第一次操作时,U为zeroValue(初始值),第一次操作之后输出结果U,作为下一次操作的U
      • 第二次操作及之后操作时,U为前一次操作输出结果,而不再是zeroValue
    • combOp: combine operation,对每个partition的结果进行combine操作。输入类型为U跟U,输出为U,即输入类型与输出类型一致,最终结果为:(K, U)类型的PairRDD

    案例

    统计单词个数 WordCount

    object TestAggregateByKey {
      def main(args: Array[String]): Unit = {
        val conf: SparkConf = new SparkConf().setAppName("TestAggregateByKey").setMaster("local[1]")
        val sc = new SparkContext(conf)
        val data = Array("hello world", "simple app is good", "good world")
        val result: Array[(String, Int)] = sc.parallelize(data, 1)
          .flatMap(_.split(" "))
          .map((_, 1))
          .aggregateByKey(0)(
            (cnt1: Int, cnt2: Int) => cnt1 + cnt2,
            (partitionAllCnt1: Int, partitionAllCnt2: Int) => partitionAllCnt1 + partitionAllCnt2
          )
          .collect()
        result.foreach(println)
      }
    }
    

    输出

    (is,1)
    (app,1)
    (simple,1)
    (hello,1)
    (good,2)
    (world,2)
    

    解释

    1. 先将每个词map成 (词语, 1)的形式
    2. 调用aggregateByKey之后,每个partition内已经按key进行分组了,之后传入初始值0作为每个组的个数,接着进行 cnt1 + cnt2,就是同个key内进行1+1操作,比如单词good 有两个value都是1,此时单词good的组内,计算的值即为2
    3. 所有partition的结果进行计算



    尊重写作权利,转载请注明出处 ^_^
  • 相关阅读:
    实时信号阻塞队列大小测试
    实时信号和非实时信号
    [Linux]关于sigprocmask函数的讨论
    java中Map集合的常用方法 (转)
    佛跳墙
    百万数据查询效率提高方法(转)
    bootstrap table 前后端分页(超级简单)
    bootstrap table 分页序号递增问题 (转)
    Spring boot+mybatis+thymeleaf 实现登录注册,增删改查
    js弹出对话框的三种方式(转)
  • 原文地址:https://www.cnblogs.com/convict/p/14828449.html
Copyright © 2020-2023  润新知