一、RDD的Join操作有哪些?

(一)Join:Join类似于SQL的inner join操作,返回结果是前面和后面集合中配对成功的,过滤掉关联不上的。源代码如下:

  1. /**

  2. * Return an RDD containing all pairs of elements with matching keys in `this` and `other`. Each

  3. * pair of elements will be returned as a (k, (v1, v2)) tuple, where (k, v1) is in `this` and

  4. * (k, v2) is in `other`. Uses the given Partitioner to partition the output RDD.

  5. */

  6. def join[W](other: RDD[(K, W)], partitioner: Partitioner): RDD[(K, (V, W))] = self.withScope {

  7. this.cogroup(other, partitioner).flatMapValues( pair =>

  8. for (v <- pair._1.iterator; w <- pair._2.iterator) yield (v, w)

  9. )

  10. }

(二)leftOuterJoin:leftOuterJoin类似于SQL中的左外关联left outer join,返回结果以前面的RDD为主,关联不上的记录为空。声明如下:

  1. /**

  2. * Perform a left outer join of `this` and `other`. For each element (k, v) in `this`, the

  3. * resulting RDD will either contain all pairs (k, (v, Some(w))) for w in `other`, or the

  4. * pair (k, (v, None)) if no elements in `other` have key k. Uses the given Partitioner to

  5. * partition the output RDD.

  6. */

  7. def leftOuterJoin[W](

  8. other: RDD[(K, W)],

  9. partitioner: Partitioner): RDD[(K, (V, Option[W]))] = self.withScope {

  10. this.cogroup(other, partitioner).flatMapValues { pair =>

  11. if (pair._2.isEmpty) {

  12. pair._1.iterator.map(v => (v, None))

  13. } else {

  14. for (v <- pair._1.iterator; w <- pair._2.iterator) yield (v, Some(w))

  15. }

  16. }

  17. }

(三)rightOuterJoin:rightOuterJoin类似于SQL中的有外关联right outer join,返回结果以参数也就是右边的RDD为主,关联不上的记录为空。声明如下:

  1. /**

  2. * Perform a right outer join of `this` and `other`. For each element (k, w) in `other`, the

  3. * resulting RDD will either contain all pairs (k, (Some(v), w)) for v in `this`, or the

  4. * pair (k, (None, w)) if no elements in `this` have key k. Uses the given Partitioner to

  5. * partition the output RDD.

  6. */

  7. def rightOuterJoin[W](other: RDD[(K, W)], partitioner: Partitioner)

  8. : RDD[(K, (Option[V], W))] = self.withScope {

  9. this.cogroup(other, partitioner).flatMapValues { pair =>

  10. if (pair._1.isEmpty) {

  11. pair._2.iterator.map(w => (None, w))

  12. } else {

  13. for (v <- pair._1.iterator; w <- pair._2.iterator) yield (Some(v), w)

  14. }

  15. }

  16. }

二、实战操作

下面我们用一个非常简单的栗子,来进行比较说明:

首先rdd1是一个行业基本RDD,包含ID和行业名称,rdd2是一个行业薪水RDD,包含ID和薪水。

[plain] view plain copy

  1. <code class="language-plain">//设置运行环境
  2. val conf = new SparkConf().setAppName("SparkRDDJoinOps").setMaster("local[4]")
  3. val sc = new SparkContext(conf)
  4. //建立一个基本的键值对RDD,包含ID和名称,其中ID为1、2、3、4
  5. val rdd1 = sc.makeRDD(Array(("1","Spark"),("2","Hadoop"),("3","Scala"),("4","Java")),2)
  6. //建立一个行业薪水的键值对RDD,包含ID和薪水,其中ID为1、2、3、5
  7. val rdd2 = sc.makeRDD(Array(("1","30K"),("2","15K"),("3","25K"),("5","10K")),2)
  8. println("//下面做Join操作,预期要得到(1,×)、(2,×)、(3,×)")
  9. val joinRDD=rdd1.join(rdd2).collect.foreach(println)
  10. println("//下面做leftOutJoin操作,预期要得到(1,×)、(2,×)、(3,×)、(4,×)")
  11. val leftJoinRDD=rdd1.leftOuterJoin(rdd2).collect.foreach(println)
  12. println("//下面做rightOutJoin操作,预期要得到(1,×)、(2,×)、(3,×)、(5,×)")
  13. val rightJoinRDD=rdd1.rightOuterJoin(rdd2).collect.foreach(println)
  14. sc.stop()</code>

三、结果如下:

  1. <span style="font-size:18px;">//下面做Join操作,预期要得到(1,×)、(2,×)、(3,×)

  2. (2,(Hadoop,15K))

  3. (3,(Scala,25K))

  4. (1,(Spark,30K))

  5. //下面做leftOutJoin操作,预期要得到(1,×)、(2,×)、(3,×)、(4,×)

  6. (4,(Java,None))

  7. (2,(Hadoop,Some(15K)))

  8. (3,(Scala,Some(25K)))

  9. (1,(Spark,Some(30K)))

  10. //下面做rightOutJoin操作,预期要得到(1,×)、(2,×)、(3,×)、(5,×)

  11. (2,(Some(Hadoop),15K))

  12. (5,(None,10K))

  13. (3,(Some(Scala),25K))

  14. (1,(Some(Spark),30K))</span>

结果就证明了我们的预期。

Spark的RDD操作之Join大全相关推荐

  1. 2021年大数据Spark(十四):Spark Core的RDD操作

    目录 RDD的操作 函数(算子)分类 Transformation函数 ​​​​​​​Action函数 RDD的操作 有一定开发经验的读者应该都使用过多线程,利用多核 CPU 的并行能力来加快运算速率 ...

  2. Spark入门必读:核心概念介绍及常用RDD操作

    导读:Spark是由加州大学伯克利分校AMP实验室开源的分布式大规模数据处理通用引擎,具有高吞吐.低延时.通用易扩展.高容错等特点.Spark内部提供了丰富的开发库,集成了数据分析引擎Spark SQ ...

  3. Spark——RDD操作详解

    转载自:https://blog.csdn.net/zhaojw_420/article/details/53261965 一.基本RDD 1.针对各个元素的转化操作  最常用的转化操作是map()和 ...

  4. spark Rdd 操作transformaction和action等

    为什么80%的码农都做不了架构师?>>>    transformation是惰性的,只有action操作的时候,才会真正执行.spark有很多api,RDD的api只是spark的 ...

  5. spark RDD操作的底层实现原理

    RDD操作闭包外部变量原则 RDD相关操作都需要传入自定义闭包函数(closure),如果这个函数需要访问外部变量,那么需要遵循一定的规则,否则会抛出运行时异常.闭包函数传入到节点时,需要经过下面的步 ...

  6. Spark的RDD转换算子

    目录 RDD转换算子 Value 类型 1. map 2. mapPartitions map 和mapPartitions 的区别 3. mapPartitionsWithIndex 4. flat ...

  7. Spark DStream相关操作

    DStream上的操作与RDD的类似,分为Transformations(转换)和Output Operations(输出)两种,此外转换操作中还有一些比较特殊的操作,如:updateStateByK ...

  8. spark常用RDD算子 汇总(java和scala版本)

    github: https://github.com/zhaikaishun/spark_tutorial  spark RDD的算子挺多,有时候如何灵活的使用,该如何用一下子想不起来,这一段时间将s ...

  9. Spark之RDD实战篇3

    键值对RDD.数据读取与保存.累加器.广播变量: 键值对RDD Spark 为包含键值对类型的 RDD 提供了一些专有的操作 在PairRDDFunctions专门进行了定义.这些 RDD 被称为 p ...

最新文章

  1. linux_shell 第一章 变量
  2. sql 70-229 考试样题(1)
  3. ios证书导出不了p12文件_IOS苹果证书无法生成.P12文件解决方法
  4. 自己动手写一个JQuery插件(第二篇)(转)
  5. linux yum localinstall 解决本地rpm包的依赖问题
  6. domino升级-602-651-851
  7. jboss启动之奇葩问题
  8. UglifyJs Unexpected token: keyword (const)
  9. html基于web2.0标准,晕倒:“用web2.0来制作符合标准的页面”
  10. 服务器显示AL018是什么意思,IIS服务器80端口却已被占用的问题
  11. 将Websocket与Spring Framework和Vuejs结合使用
  12. 前端性能优化之Lazyload
  13. Minimum Window Substring 最小覆盖子串算法
  14. 2019计算机网络考试,2019年计算机网络技术操作系统试题及答案.doc
  15. LODOP不同打印机出现偏移问题
  16. [翻译]ChipMunk 2D 游戏重力引擎
  17. 本地Navicat连接阿里云数据库RDS for MySQL(全网最详细,没有之一!)
  18. 清理win7系统盘空间
  19. 主动扫描和被动扫描的区别
  20. conv1d(): argument ‘padding‘ (position 5) must be tuple of ints, not str 这个错误是怎么回事呀?请各位帮忙看看,万分感谢

热门文章

  1. 传统公司部署OpenStack(t版)简易介绍(五)——nova模块部署
  2. c#sort升序还是降序_c# List的sort排序方法详解
  3. 男生报计算机专业前景,我是一名读文科的高三男生,将来想报计算机专业,请问可行吗?...
  4. 优信拍集团php面试题_【优信拍PHP高级开发工程师面试】面试官是我遇到过的面试水平最低的。-看准网...
  5. java 漏洞挖掘_Apache Tika命令注入漏洞挖掘
  6. java过滤器经典案例_JAVA语言基础的经典案例:猜字母游戏
  7. 外星人台式电脑_谈谈4万人民币的外星人R9台式机值不值得购买
  8. Android悬浮按钮锚点位置,Android 滑动定位+吸附悬停效果实现
  9. oracle报V27的错误解决办法,oracle11g ora-27154 past/wait 错误解决方法
  10. 多通道_多通道光纤滑环与单通道光纤滑环的设计原理区别