当前位置: 首页 > news >正文

Spark-Scala语言实战(11)

在之前的文章中,我们学习了如何在spark中使用RDD中的cartesian,subtract最终两种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。

Spark-Scala语言实战(10)-CSDN博客文章浏览阅读977次,点赞32次,收藏12次。今天开始的文章,我会带给大家如何在spark的中使用我们的RDD方法,今天学习RDD方法中的cartesian,subtract两种方法。希望我的文章能帮助到大家,也欢迎大家来我的文章下交流讨论,共同进步。https://blog.csdn.net/qq_49513817/article/details/137297066?今天的文章开始,我会继续带着大家如何在spark的中使用我们的键值对里的方法。今天学习键值对方法中的join,rightOuterJoin,leftOuterJoin三种方法。

目录

一、知识回顾

二、键值对方法

1.join

2.rightOuterJoin

3. leftOuterJoin

拓展-方法参数设置与键值对

1.方法参数设置

2.键值对


一、知识回顾

 上一篇文章中我们学习了RDD的两种方法,分别是cartesian,subtract。

cartesian可以求笛卡儿积,及两个集合的元素两两组合

    

可以看到两个集合的元素两两组合在一起了。

subtract是我们的一个补集操作。

  当p2补p1时,肯定会输出p2中没有的p1有的即我们的1,2

现在,开始今天的学习吧

二、键值对方法

1.join

  • join()方法用于根据键对两个RDD进行内连接,将两个RDD中键相同的数据的值存放在一个元组中,最后只返回两个RDD中都存在的键的连接结果。
  • 例如,在两个RDD中分别有键值对(K,V)(K,W),通过join()方法连接会返回(K,(V,W))
  • 创建两个RDD,含有相同键和不同的键,通过join()方法进行内连接。
import org.apache.spark.{SparkConf, SparkContext}object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)// 创建第二个RDD,包含一些键值对val p1 = sc.parallelize(Array(("A", 1), ("B", 2), ("C", 3)))// 创建第二个RDD,包含一个不同的键值对val p2 = sc.parallelize(Array(("A", 5), ("B", 3), ("d", 1)))// 执行join操作,基于键进行匹配val p3 = p1.join(p2)// 显示join后的结果p3.collect().foreach(println)}
}

可以看到我们的代码创建了两个RDD,包含相同的键A,B与不同的键C,D。那么将它们进行join连接,肯定只会匹配相同键与键的值,那即代表运行我们的代码,看到的只会是我们A,B键与它的值。现在运行代码看看是否与我们所预期的一致吧。

  

可以看到输出的分别是A,B与它们的值,所预期一致。 

2.rightOuterJoin

  • rightOuterJoin()方法用于根据键对两个RDD进行右外连接,连接结果是右边RDD的所有键的连接结果,不管这些键在左边RDD中是否存在。
  • rightOuterJoin()方法中,如果在左边RDD中有对应的键,那么连接结果中值显示为Some类型值;如果没有,那么显示为None值。
import org.apache.spark.{SparkConf, SparkContext}object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)// 创建第二个RDD,包含一些键值对val p1 = sc.parallelize(Array(("A", 1), ("B", 2), ("C", 3)))// 创建第二个RDD,包含一个不同的键值对val p2 = sc.parallelize(Array(("A", 5), ("B", 3), ("d", 1)))val p3 = p1.rightOuterJoin(p2)p3.collect().foreach(println)}
}

通过上面的描述可以知道rightOuterJoin方法在这里使用后,肯定是只会输出p2所包含的,p1有的p2没有就会直接忽略掉,而p2有的p1没有那么相应的输出位置就会为None值,那么在这里,肯定就会是键A,B,d了,且d里肯定有一个空(None)值。

运行代码

  

可以看到输出与预期一致。 

3. leftOuterJoin

  •   leftOuterJoin()方法用于根据键对两个RDD进行左外连接,与rightOuterJoin()方法相反,返回结果保留左边RDD的所有键。 
import org.apache.spark.{SparkConf, SparkContext}object p1 {def main(args: Array[String]): Unit = {val conf=new SparkConf().setMaster("local").setAppName("p2")val sc=new SparkContext(conf)// 创建第二个RDD,包含一些键值对val p1 = sc.parallelize(Array(("A", 1), ("B", 2), ("C", 3)))// 创建第二个RDD,包含一个不同的键值对val p2 = sc.parallelize(Array(("A", 5), ("B", 3), ("d", 1)))// 执行join操作,基于键进行匹配val p3 = p1.leftOuterJoin(p2)// 显示join后的结果p3.collect().foreach(println)}
}

学习了上面,那下面这个 leftOuterJoin就很好理解了,就是与上面相反,肯定是只会输出p1所包含的,p2有的p1没有就会直接忽略掉,同时也会产生空值。

  

快去试试吧~ 

拓展-方法参数设置与键值对

1.方法参数设置

方法参数参数说明使用例子效果
joinother: RDD[(K, V)]另一个需要进行连接的RDD,具有相同的键类型Krdd1.join(rdd2)返回两个RDD的键相同的元素对组成的RDD
仅包含两个RDD中都存在的键对应的元素对
rightOuterJoinother: RDD[(K, W)]另一个需要进行右外连接的RDD,具有相同的键类型Krdd1.rightOuterJoin(rdd2)返回以rdd2的键为基准的左连接结果
rdd1中与rdd2键匹配的元素对会被返回
rdd2中不与rdd1键匹配的键对应的元素对,其值会被设为null
leftOuterJoinother: RDD[(K, W)]另一个需要进行左外连接的RDD,具有相同的键类型Krdd1.leftOuterJoin(rdd2)返回以rdd1的键为基准的左连接结果
rdd1中的所有元素对都会被返回
对于rdd1中与rdd2键匹配的元素对,其值会被正常返回
对于rdd1中不与rdd2键匹配的键,其值会被设为null

2.键值对

 在 Spark 中,键值对(Key-Value Pair)通常指的是由两个元素组成的元组,其中第一个元素是键(Key),第二个元素是值(Value)。这种键值对的数据结构在 Spark 中非常常见,特别是在处理 RDD(弹性分布式数据集)时。

在 Spark 中,键值对 RDD(Pair RDD)允许你对数据进行一系列的操作,这些操作主要依赖于键。例如,你可以根据键对数据进行分组(groupByKey)、排序(sortByKey)、连接(join)、减少(reduceByKey)等。

键值对 RDD 在 Spark 中通过 scala.Tuple2 类实现,通常简写为 (K, V),其中 K 是键的类型,V 是值的类型。例如,你可以有一个 (String, Int) 类型的键值对 RDD,其中字符串是键,整数是值。

相关文章:

  • loopvar 改动不同版本的影响-并发
  • 4.2.k8s的pod-标签管理、镜像拉取策略、容器重启策略、资源限制、优雅终止
  • Clion 输出乱码 解决方案
  • LeetCode热题100
  • 编程:不只是工作,是我生活的一部分
  • Linux服务篇之FTP及SFTP
  • 数字电子技术基础入门(三)
  • [xboard]real6410-3 S3C6410光盘资料与功能测试
  • Pandas学习笔记——第二弹
  • C++修炼之路之string--标准库中的string
  • neo4j图数据库下载安装配置
  • 【C++造神计划】printf 与 cout
  • Mysql底层原理四:B+树索引
  • Python对docx文本一些操作
  • C++ 11 新特性:内存对齐 alignof 和 alignas
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android单元测试 - 几个重要问题
  • MobX
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • node学习系列之简单文件上传
  • PV统计优化设计
  • WebSocket使用
  • 彻底搞懂浏览器Event-loop
  • 当SetTimeout遇到了字符串
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 提醒我喝水chrome插件开发指南
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我的业余项目总结
  • 协程
  • puppet连载22:define用法
  • !!Dom4j 学习笔记
  • #大学#套接字
  • (8)STL算法之替换
  • (arch)linux 转换文件编码格式
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (搬运以学习)flask 上下文的实现
  • (二)JAVA使用POI操作excel
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (南京观海微电子)——I3C协议介绍
  • (算法)前K大的和
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原)本想说脏话,奈何已放下
  • **PHP二维数组遍历时同时赋值
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Reactor简单使用教程
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 后台导出excel ,word
  • .Net6使用WebSocket与前端进行通信
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装