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,这里要求两个RDD的partition数量以及元素数量都相同,否则会抛出异常。
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: 这个函数定义了当两个累加器(对应于同一个键但可能来自不同的分区)需要合并时应该执行的操作。在我的代码中,也是将两个累加器值相加
这确保了无论数据如何在分区之间分布,最终每个键都会得到正确的累加结果。
看看输出效果
可以看到我们的键值对成功累加。
快去试试吧~
拓展-方法参数设置
方法 | 参数 | 描述 | 例子 |
---|---|---|---|
fullOuterJoin | otherRDD | 另一个要与之进行全外连接的RDD | rdd1.fullOuterJoin(rdd2) |
fullOuterJoin | numPartitions | 结果RDD的分区数(可选) | rdd1.fullOuterJoin(rdd2, numPartitions=10) |
zip | otherRDD | 要与之进行zip操作的另一个RDD | rdd1.zip(rdd2) |
combineByKey | createCombiner | 处理第一个出现的每个键的值的函数 | lambda v: (v, 1) |
combineByKey | mergeValue | 合并具有相同键的值的函数 | lambda acc, v: (acc[0] + v, acc[1] + 1) |
combineByKey | mergeCombiners | 合并两个累积器的函数 | lambda acc1, acc2: (acc1[0] + acc2[0], acc1[1] + acc2[1]) |
combineByKey | numPartitions | 结果RDD的分区数(可选) | rdd.combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=5) |
相关文章:

Spark-Scala语言实战(13)
在之前的文章中,我们学习了如何在spark中使用键值对中的keys和values,reduceByKey,groupByKey三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢…...
Android compose 使用指纹验证
基于compose进行指纹验证 点击按钮进行验证 Button(onClick {var passed falseval biometic BiometricPrompt.Builder(applicationContext).setTitle("使用指纹解锁App").setSubtitle("证明你是手机的主人").setNegativeButton("取消验证",…...

开源模型应用落地-chatglm3-6b模型小试-入门篇(一)
一、前言 刚开始接触AI时,您可能会感到困惑,因为面对众多开源模型的选择,不知道应该选择哪个模型,也不知道如何调用最基本的模型。但是不用担心,我将陪伴您一起逐步入门,解决这些问题。 在信息时代…...
C++实现单例模式
#include <iostream> class Singleton { private: static Singleton* instance; // 指向单例实例的指针 Singleton() {} // 私有构造函数 public: // 获取单例对象的唯一全局访问点 static Singleton* getInstance() { if (instance nullpt…...

虚幻UE5智慧城市全流程开发教学
一、背景 这几年,智慧城市/智慧交通/智慧水利等飞速发展,骑士特意为大家做了一个这块的学习路线。 二、这是学习大纲 1.给虚幻UE5初学者准备的智慧城市/数字孪生蓝图开发教程 https://www.bilibili.com/video/BV1894y1u78G 2.UE5数字孪生蓝图开发教学…...

docker的安装及入门指令
目录 一、将docker安装到云服务器步骤 1.更新系统yum版本 2.安装所需依赖 3.添加docker仓库设置(使用的是阿里云) 4.安装docker引擎 5.启动docker并开启自动启动 6. 检查是否安装成功,成功会显示相应版本,否则安装失败 二、docker常用命令 1.从…...

聚能共创下一代智能终端操作系统 软通动力荣膺“OpenHarmony优秀贡献单位”
近日,由开放原子开源基金会指导,以“开源共享未来”为主题的OpenHarmony社区年会在北京成功举办。本次活动汇集OpenHarmony项目群共建单位及生态伙伴等多方力量,旨在对2023年度OpenHarmony年度开源事业全面总结的同时,吸引更多伙伴…...

云服务器ECS租用价格表报价——阿里云
阿里云服务器租用价格表2024年最新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核…...

光猫桥接模式详细步骤
目录 一、前言 路由模式 (宽带默认) 桥接模式 二、桥接模式步骤 (一)图片记录备份 设备信息图 网络侧信息 远程管理密码 宽带上网设置 (二)桥接模式开始 光猫设置 路由器设置 一、前言 重点&a…...

构建开源可观测平台
企业始终面临着确保 IT 基础设施和应用程序全年可用的压力。现代架构(容器、混合云、SOA、微服务等)的复杂性不断增长,产生大量难以管理的日志。我们需要智能应用程序性能管理 (APM) 和可观察性工具来实现卓越生产并满足可用性和正常运行时间…...

SketchUp Pro 2024 for mac 草图大师 专业的3D建模软件
SketchUp Pro 2024 for Mac是一款功能强大的三维建模软件,适用于Mac电脑。其简洁易用的界面和强大的工具集使得用户可以轻松创建复杂的3D模型。 软件下载:SketchUp Pro 2024 for mac v24.0.483 激活版下载 SketchUp Pro 2024 for Mac支持导入和导出多种文…...

通过 Cookie、Redis共享Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(三)
本篇内容对应 “2.4 生成验证码” 小节 和 “4.7 优化登陆模块”小节 视频链接 1 Kaptcha介绍 Kaotcga是一个生成验证码的工具。 你的网站验证码是什么? 在我们这个牛客论坛项目,验证码分为两部分 给用户看的是图片,用户根据图片上显示的…...

学习 Git 基础知识 - 日常开发任务手册
欢迎来到我关于 Git 的综合指南,Git 是一种分布式版本控制系统,已经在软件开发中彻底改变了协作和代码管理方式。 无论你是经验丰富的开发者还是刚开始编程之旅的新手,理解 Git 对于正确掌控代码、高效管理项目和与他人合作至关重要。 在本…...
pip和conda 设置安装源
pip和conda 设置安装源 conda查看 channels添加 channels移除 channelschannels 配置文件 pip查看 index-url添加 index-url移除 index-urlindex-url 配置文件 常用源 conda 查看 channels conda config --show channels添加 channels conda config --add channels https:/…...
数据分析之Logistic回归分析中的【多元有序逻辑回归】
1、定义 多元有序逻辑回归用于分析有序分类因变量与一个或多个自变量之间的关系。有序逻辑回归适用于因变量具有自然排序但没有固定间距的类别,例如疾病严重程度(轻度、中度、重度)或调查问卷中的满意度评分(非常不满意、不满意、…...

路由器拨号失败解决方法
目录 一、遇到问题 二、测试 三、解决方法 (一)路由器先单插wan口设置 (二)mac地址替换 (三)更改路由器DNS 一、遇到问题 1 .在光猫使用桥接模式,由路由器进行拨号的时候,出现…...

Oracle 中 where 和 on 的区别
1.Oracle 中 where 和 on 的区别 on:会先根据on后面的条件进行筛选,条件为真时返回该行,由于on的优先级高于left join,所以left join关键字会把左表中没有匹配的所有行也都返回,然后生成临时表返回,执行优先级高于…...

NLP学习路线总结
自然语言处理(Natural Language Processing,NLP)是人工智能和语言学领域的一部分,它旨在让计算机能够理解、解释和生成人类语言。NLP学习路线可以大致分为以下几个步骤: 1. 基础知识准备 - 计算机科学知识:…...

AI绘图cuda与stable diffusion安装部署始末与避坑
stable diffusion的安装说起来很讽刺,最难的不是stable diffusion,而是下载安装cuda。下来我就来分享一下我的安装过程,失败了好几次,几近放弃。 一、安装cuda 我们都知道cuda是显卡CPU工作的驱动(或者安装官网的解释…...

OpenCv —— cv::VideoCapture设置摄像头图像格式为“MJPEG“
背景 今天恰巧同事有台USB摄像头,她想要在Windows系统下通过OpenCV读取该摄像头宽高为1080x768、帧率为60的视频,用来做图像算法处理。但无奈通过网上OpenCV教程 读取的视频对应尺寸的帧率仅为10帧左右,根本无法满足使用要求。于是作者通过本篇文章介绍如何解决,欢迎交流指…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

claude3.7高阶玩法,生成系统架构图,国内直接使用
文章目录 零、前言一、操作指南操作指导 二、提示词模板三、实战图书管理系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 在线考试系统通过4o模型生成系统描述通过claude3.7生成系统架构图svg代码转换成图片 四、感受 零、前言 现在很多AI大模型可以…...

Vue.js教学第二十一章:vue实战项目二,个人博客搭建
基于 Vue 的个人博客网站搭建 摘要: 随着前端技术的不断发展,Vue 作为一种轻量级、高效的前端框架,为个人博客网站的搭建提供了极大的便利。本文详细介绍了基于 Vue 搭建个人博客网站的全过程,包括项目背景、技术选型、项目架构设计、功能模块实现、性能优化与测试等方面。…...