• Spark 学习笔记之 aggregateByKey


    aggregateByKey:

    import org.apache.spark.SparkContext
    import org.apache.spark.rdd.RDD
    import org.apache.spark.sql.SparkSession
    
    object TransformationsDemo {
      def main(args: Array[String]): Unit = {
        val sparkSession = SparkSession.builder().appName("TransformationsDemo").master("local[1]").getOrCreate()
        val sc = sparkSession.sparkContext
        testAggregateByKey(sc)
    
      }
    
    
      private def testAggregateByKey(sc: SparkContext) = {
        var data = sc.parallelize(List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8)),1)
        def seq(a:Int, b:Int) : Int ={
          println("seq: " + a + "	 " + b)
          math.max(a,b)
        }
    
        def comb(a:Int, b:Int) : Int ={
          println("comb: " + a + "	 " + b)
          a + b
        }
    
        data.aggregateByKey(0)(seq, comb).collect.foreach(println)
      }
    }
    

    运行结果:

    运行结果分析:  

    根据Key值的不同,可以分为3个组:

    (1)  (1,3),(1,2),(1,4);

    (2)  (2,3);

    (3)  (3,6),(3,8)。

    这3个组分别进行seqOp,也就是(K,V)里面的V和0进行math.max()运算,运算结果和下一个V继续运算,以第一个组为例,运算过程是这样的:

    0, 3 => 3

    3, 2 => 3

    3, 4 => 4

    所以最终结果是(1,4)。

    第二组结果是(2,3)。

    第三组结果是(3,8)。

    combOp是对把各分区的V加起来,由于这里并没有分区,所以实际上是不起作用的。

    修改下代码,添加分区:

      private def testAggregateByKey(sc: SparkContext) = {
        var data = sc.parallelize(List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8)),3)
        def seq(a:Int, b:Int) : Int ={
          println("seq: " + a + "	 " + b)
          math.max(a,b)
        }
    
        def comb(a:Int, b:Int) : Int ={
          println("comb: " + a + "	 " + b)
          a + b
        }
    
        data.aggregateByKey(0)(seq, comb).collect.foreach(println)
      }
    

    运行结果:

    运行结果分析:

    根据Key值的不同,可以分为3个区:

    (1)  (1,3),(1,2);

    (2)  (1,4),(2,3);

    (3)  (3,6),(3,8)。

    区内先做求最大值

    第一组结果是(1,3)。

    第二组结果是(1,4),(2,3)。

    第三组结果是(3,8)。

    combOp是对把各分区的V加起来,由于此次有分区,所以(1,3)和(1,4),做合并操作,结果:(1, 7)。

  • 相关阅读:
    leetcode 字符串的全排列 All In One
    数据结构栈 All In One
    vscode code snippets not working All In One
    js 使用 canvas 实现一个一笔一画写汉字的效果 All In One
    社保 & 养老金 & 养老保险 All In One
    python 中 lambda 函数
    linux 中vim 中的回退、前进
    python 中统计fasta文件scaffolds平均长度、最长scaffolds、最短scaffolds
    ubuntu 中设置 root登录filezilla
    python中统计基因组所含N碱基总个数
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7787919.html
Copyright © 2020-2023  润新知