面试系列之:spark中常用经典算子的源码剖析
程序员文章站
2022-07-15 17:10:47
...
1:使用cogroup实现join
-
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:看下源码是如何实现的:
很完美~
上一篇: vagrant创建虚拟机共享文件夹出错
下一篇: Spark高频面试题总结