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

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:看下源码是如何实现的:

很完美~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值