欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面试系列之:spark中常用经典算子的源码剖析

程序员文章站 2022-07-15 17:10:47
...

1:使用cogroup实现join

 

  1. cogroup 算子初探:这是一个用途很广泛的算子在底层实现上

val appName = this.getClass.getSimpleName.dropRight(1)
    val spark = SparkSession.builder().master("local[*]").appName(appName).getOrCreate()
    val map1 = Seq('a' -> 1, 'b' -> 2, 'c' -> 3)
    val map2 = Seq('a' -> 11, 'b' -> 22, 'c' -> 33)

    val df1 = spark.sparkContext.parallelize(map1)
    val df2 = spark.sparkContext.parallelize(map2)
    // 数据类型RDD[(Char, (scala.Iterable[Int], scala.Iterable[Int]))]
    //可以看到这里得到的iterable的迭代器
    val cgdt_raw = df1.cogroup(df2)
    cgdt_raw.foreach(println(_))

    // 得到的结果 K V value就是汇聚好的数据
    //    (c,(CompactBuffer(3),CompactBuffer(33)))
    //    (b,(CompactBuffer(2),CompactBuffer(22)))
    //    (a,(CompactBuffer(1),CompactBuffer(11)))

2:用cogroup实现join算子:

//这里其实就是join的实现
    val cgdt = df1.cogroup(df2).flatMapValues(pair =>
      for (v <- pair._1.iterator; w <- pair._2.iterator) yield (v, w)
    )
    // 结果集
    //    (b,(2,22))
    //    (c,(3,33))
    //    (a,(1,11))
    cgdt.foreach(println(_))
    spark.stop()

3:看下源码是如何实现的:

很完美~

面试系列之:spark中常用经典算子的源码剖析

相关标签: spark 面试