Spark-Scala语言实战(13)

在之前的文章中,我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。

Spark-Scala语言实战(12)-CSDN博客文章浏览阅读722次,点赞19次,收藏15次。今天开始的文章,我会带给大家如何在spark的中使用我们的键值对方法,今天学习键值对方法中的keys和values,reduceByKey,groupByKey三种方法。希望我的文章能帮助到大家,也欢迎大家来我的文章下交流讨论,共同进步。https://blog.csdn.net/qq_49513817/article/details/137385224今天的文章开始,我会继续带着大家如何在spark的中使用我们的键值对里的方法。今天学习键值对方法中的fullOuterJoin,zip,combineByKey三种方法。

目录

一、知识回顾

二、键值对方法

1.fullOuterJoin

2.zip

3.combineByKey

拓展-方法参数设置


一、知识回顾

 上一篇文章中我们学习了键值对的三种方法,分别是keys和values,reduceByKey,groupByKey。

keys和values分别对应了我们的键与值。

我们可以用它们来创建我们的RDD

 reduceByKey可以进行统计,将有相同键的值进行相加,统一输出。

而 groupByKey方法就是对我们的键值对RDD进行分组了

它可以将我们的相同的键,不同的值组合成一个组。

那么,开始今天的学习吧~ 

二、键值对方法

1.fullOuterJoin

  •  fullOuterJoin()方法用于对两个RDD进行全外连接,保留两个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(Seq(("a1", "1"), ("a2", "2"), ("a3", "3")))val p2 = sc.parallelize(Seq(("a2", "A"), ("a3", "B"), ("a4", "C")))// 将RDD转换为键值对val pp1 = p1.map { case (key, value) => (key, value) }val pp2 = p2.map { case (key, value) => (key, value) }// 执行fullOuterJoin操作val ppp = pp1.fullOuterJoin(pp2)// 收集结果并打印ppp.collect().foreach(println)}
}

我们的代码创建了两个键值对RDD,那么使用 fullOuterJoin方法全外连接那么两个键值对都会连接。

可以看到两个键值对里的键与值都连接上了,互相没有的值即显示None值。 

2.zip

  • zip()方法用于将两个RDD组合成键值对RDD,要求两个RDD的分区数量以及元素数量相同,否则会抛出异常。
  • 将两个RDD组合成Key/Value形式的RDD,这里要求两个RDDpartition数量以及元素数量都相同,否则会抛出异常
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)// 创建两个RDDval p1 = sc.parallelize(Seq(1, 2, 3))val p2 = sc.parallelize(Seq("a", "b", "c"))// 使用zip方法将两个RDD组合在一起val pp1 = p1.zip(p2)val pp2 = p2.zip(p1)// 收集结果并打印pp1.collect().foreach(println)pp2.collect().foreach(println)}
}

 代码创建了两个不同的RDD键值对,分别使用p1zip方法p2与p2zip方法p1,那么它们输出的结果会是一样的吗?

可以看到是不一样的,谁在前面谁就是键,反之是值。 

3.combineByKey

  • combineByKey()方法是Spark中一个比较核心的高级方法,键值对的其他一些高级方法底层均是使用combineByKey()方法实现的,如groupByKey()方法、reduceByKey()方法等。
  • combineByKey()方法用于将键相同的数据聚合,并且允许返回类型与输入数据的类型不同的返回值。
  • combineByKey()方法的使用方式如下。
    • combineByKey(createCombiner,mergeValue,mergeCombiners,numPartitions=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)val p1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("c", 5)))val p2 = p1.combineByKey(// createCombiner: 将第一个值转换为累加器(v: Int) => v,// mergeValue: 将新的值加到累加器上(c: Int, v: Int) => c + v,// mergeCombiners: 合并两个累加器(c1: Int, c2: Int) => c1 + c2)p2.collect().foreach { case (key, value) =>println(s"Key: $key, Value: $value")}}
}

我的代码中: 

createCombiner: 这个函数定义了如何将每个键的第一个值转换为初始的累加器值。 

代表着每个键,第一个出现的值将作为累加器的初始值。

mergeValue: 这个函数定义了如何将新值与当前的累加器值合并。在我的代码中,我将新值与累加器相加。

代表着每个键的后续值,它们都会被加到当前的累加器值上。

mergeCombiners: 这个函数定义了当两个累加器(对应于同一个键但可能来自不同的分区)需要合并时应该执行的操作。在我的代码中,也是将两个累加器值相加

这确保了无论数据如何在分区之间分布,最终每个键都会得到正确的累加结果。

看看输出效果

可以看到我们的键值对成功累加。

快去试试吧~ 

拓展-方法参数设置

方法参数描述例子
fullOuterJoinotherRDD另一个要与之进行全外连接的RDDrdd1.fullOuterJoin(rdd2)
fullOuterJoinnumPartitions结果RDD的分区数(可选)rdd1.fullOuterJoin(rdd2, numPartitions=10)
zipotherRDD要与之进行zip操作的另一个RDDrdd1.zip(rdd2)
combineByKeycreateCombiner处理第一个出现的每个键的值的函数lambda v: (v, 1)
combineByKeymergeValue合并具有相同键的值的函数lambda acc, v: (acc[0] + v, acc[1] + 1)
combineByKeymergeCombiners合并两个累积器的函数lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1])
combineByKeynumPartitions结果RDD的分区数(可选)rdd.combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=5)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++类静态成员变量

C中的静态成员变量是属于类的成员变量&#xff0c;而不是属于类的具体实例的。静态成员变量提供了一种方便的机制&#xff0c;可以在类的所有实例之间共享数据&#xff0c;并且可以用于跟踪类的实例数量、存储全局信息以及实现全局性质的函数或数据。 #include <iostream&g…

JavaSE:图书管理系统

目录 一、前言 二、内容需求 三、类的设计 &#xff08;一&#xff09;图书类 1.Book 类 2.BookList 类 &#xff08;二&#xff09;操作类 1.添加图书AddOperation类 2.借阅图书BorrowOperation类 3.删除图书DelOperation类 4.显示图书ShowOperation类 5.退出系统Ex…

通俗易懂地解释Go语言不同版本中垃圾回收机制的演进过程

完整课程请点击以下链接 Go 语言项目开发实战_Go_实战_项目开发_孔令飞_Commit 规范_最佳实践_企业应用代码-极客时间 Go 1.3时代 - 标记清除算法 这就像一个人要打扫房间,首先需要暂停其他活动。然后开始查看房间里的每件物品,对于自己仍需要使用的物品做上记号。查看完毕后…

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…

手写Spring框架

手写Spring框架 准备工作Spring启动和扫描逻辑实现依赖注入的实现Aware回调模拟实现和初始化机制模拟实现BeanPostProcessor (Bean的后置处理器) 模拟实现Spring AOP 模拟实现Spring Bean生命周期源码分析 Spring中两种生成代理的方式题外话 Spring事务相关Spring事务传播机制S…

【Java】用吃拉面的方式打开Java程序的执行流程

你还在为记不住Java程序的执行流程而苦恼吗&#xff1f;那你来对地方了&#xff0c;这篇博客将让你一次记住终生不忘。 接下来&#xff0c;我们用去兰州拉面的过程&#xff0c;来形象地看一下&#xff0c;当你运行一个的main方法时&#xff0c;到底发生了什么&#xff1a; 走进…

c++找最高成绩

根据给定的程序&#xff0c;写成相关的成员函数&#xff0c;完成指定功能。 函数接口定义&#xff1a; 定义max函数&#xff0c;实现输出最高成绩对应的学号以及最高成绩值。 裁判测试程序样例&#xff1a; #include <iostream> using namespace std; class Student{…

C++——栈和队列容器

前言&#xff1a;这篇文章我们将栈和队列两个容器放在一起进行分享&#xff0c;因为这两个要分享的知识较少&#xff0c;而且两者在结构上有很多相似之处&#xff0c;比如栈只能在栈顶操作&#xff0c;队列只能在队头和队尾操作。 不同于前边所分享的三种容器&#xff0c;这篇…

HarmonyOS 应用开发-ArkUI(ets)仿“腾讯新闻”APP

一、效果演示 1、新闻列表页 2、新闻详情页、图片展示页 3、视频页 4、动态页 二、 流程图 –本来自定义了视频的控制栏的&#xff0c;但是发现VideoController()控制器的bug会导致控制器失效&#xff0c;所以没继续做。视频页先不搞了。 三、文件组织&#xff08;“我的页面…

网工内推 | 深信服、宁德时代,最高20K招安全工程师,包吃包住

01 深信服科技 招聘岗位&#xff1a;安全服务工程师 职责描述&#xff1a; 1.负责现场安全服务项目工作内容&#xff0c;包含渗透测试、安全扫描、基线核查、应急响应等&#xff1b; 2.协助用户完成安全测试漏洞整改、复测工作&#xff1b; 3.为用户提供网络、主机、业务系统等…

dg_mmld部分复现

Ours ( K ˆ \^{K} Kˆ2)复现结果– Photo&#xff1a;0.9634730538922156 (at Epoch 23) Art&#xff1a;0.8125 (at Epoch 23) Cartoon&#xff1a;0.7713310580204779 (at Epoch 18) 差距在可接受范围内 辅助信息 If you send 作者 an e-mail, 作者 will tell you a URL w…

2022年蓝桥杯省赛——重合次数

目录 题目链接&#xff1a;1.重合次数 - 蓝桥云课 (lanqiao.cn) 题目描述 答案提交 运行限制 思路 总结 题目链接&#xff1a;1.重合次数 - 蓝桥云课 (lanqiao.cn) 题目描述 在同一天中, 从上午 6 点 13 分 22 秒到下午 14 点 36 分 20 秒, 钟表上的 分针和秒针一共重合…

HTML - 请你谈一谈img标签图片和background背景图片的区别

难度级别:中级及以上 提问概率:65% 面试官当然不会问如何使用img标签或者background来加载一张图片,这些知识点都很基础,相信只要从事前端开发一小段时间以后,就可以轻松搞定加载图片的问题。但很多人习惯用img标签,很多人习惯用backgro…

Java 数据类型转换

String 转 char 数组 String str "abc"; char[] charArr str.toCharArray();char 数组转 String char[] charArr{a, b, c}; String str new String(charArr);char 字符转 String 使用 String.valueOf() 方法 char ch a; String str String.valueOf(ch);使…

element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内

写在前面 日期限制处理&#xff08;禁用&#xff09;&#xff0c;下面我以我这边的需求为例&#xff0c; 选择的年份需等于或小于当前年份 选择的年份范围必须在三年之内 1.限制起始日期小于截止日期 1&#xff09;根据用户选中的开始日期&#xff0c;置灰不可选的日期范围&…

【腾讯云 TDSQL-C Serverless 产品体验】饮水机式使用云数据库

云计算的发展从IaaS&#xff0c;PaaS&#xff0c;SaaS&#xff0c;到最新的BaaS&#xff0c;FasS&#xff0c;在这个趋势中serverless(去服务器化&#xff09; 计算资源发展Physical -> Virtualisation -> Cloud Compute -> Container -> Serverless。 一、背景介绍…

LeetCode 264. 丑数 II

解题思路 三个指针进行遍历&#xff0c;归并排序。 相关代码 class Solution {public int nthUglyNumber(int n) {int temp1;int a[] new int[n];a[0] 1;for(int i0,j0,k0,index1;index<n;index){temp Math.min(a[i]*2,Math.min(a[k]*5,a[j]*3));a[index] temp;if(te…

什么是电子邮件组,为什么要使用它们?

在当今时代&#xff0c;电子邮件无处不在&#xff0c;尤其是对于商业活动而言。电子邮件的重要性不容忽视&#xff0c;因为它在沟通中极为高效。然而&#xff0c;电子邮件也存在降低工作效率和阻碍流程的风险。在这种情况下&#xff0c;电子邮件群组就是最佳的解决方案。什么是…

代码随想录算法训练营第二十九天|491.递增子序列,46.全排列,47.全排列 II

题目&#xff1a;491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中至少有两个元素。你可以按任意顺序返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一…

VUE路由跳转、传参总结

路由跳转方式有哪些&#xff1f; 在Vue中&#xff0c;路由跳转主要有以下几种方式&#xff1a; 使用router-link组件&#xff1a; <router-link to"/home">Home</router-link>使用编程式导航 // 字符串 this.$router.push(home)// 对象 this.$router.…