Spark 4:Spark Core 共享变量

广播变量

# coding:utf8
import timefrom pyspark import SparkConf, SparkContext
from pyspark.storagelevel import StorageLevelif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)stu_info_list = [(1, '张大仙', 11),(2, '王晓晓', 13),(3, '张甜甜', 11),(4, '王大力', 11)]# 1. 将本地Python List对象标记为广播变量broadcast = sc.broadcast(stu_info_list)score_info_rdd = sc.parallelize([(1, '语文', 99),(2, '数学', 99),(3, '英语', 99),(4, '编程', 99),(1, '语文', 99),(2, '编程', 99),(3, '语文', 99),(4, '英语', 99),(1, '语文', 99),(3, '英语', 99),(2, '编程', 99)])def map_func(data):id = data[0]name = ""# 匹配本地list和分布式rdd中的学生ID  匹配成功后 即可获得当前学生的姓名# 2. 在使用到本地集合对象的地方, 从广播变量中取出来用即可for stu_info in broadcast.value:stu_id = stu_info[0]if id == stu_id:name = stu_info[1]return (name, data[1], data[2])print(score_info_rdd.map(map_func).collect())"""
场景: 本地集合对象 和 分布式集合对象(RDD) 进行关联的时候
需要将本地集合对象 封装为广播变量
可以节省:
1. 网络IO的次数
2. Executor的内存占用
"""

累加器

# coding:utf8
import timefrom pyspark import SparkConf, SparkContext
from pyspark.storagelevel import StorageLevelif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2)# Spark提供的累加器变量, 参数是初始值acmlt = sc.accumulator(0)def map_func(data):global acmltacmlt += 1# print(acmlt)rdd2 = rdd.map(map_func)rdd2.cache()rdd2.collect()rdd3 = rdd2.map(lambda x:x)rdd3.collect()print(acmlt)

综合案例

# coding:utf8
import timefrom pyspark import SparkConf, SparkContext
from pyspark.storagelevel import StorageLevel
import reif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)# 1. 读取数据文件file_rdd = sc.textFile("../data/input/accumulator_broadcast_data.txt")# 特殊字符的list定义abnormal_char = [",", ".", "!", "#", "$", "%"]# 2. 将特殊字符list 包装成广播变量broadcast = sc.broadcast(abnormal_char)# 3. 对特殊字符出现次数做累加, 累加使用累加器最好acmlt = sc.accumulator(0)# 4. 数据处理, 先处理数据的空行, 在Python中有内容就是True None就是Falselines_rdd = file_rdd.filter(lambda line: line.strip())# 5. 去除前后的空格data_rdd = lines_rdd.map(lambda line: line.strip())# 6. 对数据进行切分, 按照正则表达式切分, 因为空格分隔符某些单词之间是两个或多个空格# 正则表达式 \s+ 表示 不确定多少个空格, 最少一个空格words_rdd = data_rdd.flatMap(lambda line: re.split("\s+", line))# 7. 当前words_rdd中有正常单词 也有特殊符号.# 现在需要过滤数据, 保留正常单词用于做单词计数, 在过滤 的过程中 对特殊符号做计数def filter_func(data):"""过滤数据, 保留正常单词用于做单词计数, 在过滤 的过程中 对特殊符号做计数"""global acmlt# 取出广播变量中存储的特殊符号listabnormal_chars = broadcast.valueif data in abnormal_chars:# 表示这个是 特殊字符acmlt += 1return Falseelse:return Truenormal_words_rdd = words_rdd.filter(filter_func)# 8. 正常单词的单词计数逻辑result_rdd = normal_words_rdd.map(lambda x: (x, 1)).\reduceByKey(lambda a, b: a + b)print("正常单词计数结果: ", result_rdd.collect())print("特殊字符数量: ", acmlt)

广播变量解决了什么问题?
分布式集合RDD和本地集合进行关联使用的时候,降低内存占用以及减少网络IO传输,提高性能。
累加器解决了什么问题?
分布式代码执行中,进行全局累加。

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

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

相关文章

ES6——Promise

promise 含义:异步编程解决方案 特点:1、状态不受外界影响,状态有三种:pending、fulfilled、rejected 2、状态不可逆,只能pending -> fulfilled、pending -> rejected 缺点:无法取消、不设置回调函…

mysql数字开头字符串排序

表结构 CREATE TABLE building (id bigint NOT NULL,name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 名称,full_name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 全称,PRIMARY KEY (id) USIN…

javascript 将json数据导出excel

<el-button type"primary" plain v-on:click"jsonToExcel();">导出</el-button>jsonToExcel() {const data this.AlarmData;let head "城市,站点,时间,A相电流(A),B相电流(A),C相电流(A),SO2压力(MPa),CO压力(MPa),NOX压力(MPa),A相电压…

总结930

之前本打算每天学12h&#xff0c;践行了一周&#xff0c;一天最多也就学11.5h,在时间利用上感觉已经趋于饱和的了。 这个时候&#xff0c;时间统计法应该能发挥它应有的作用了&#xff0c;但就算详细记录每日时间支出&#xff0c;也不能从根本上解决问题。 一味的进行时间上的…

基于Springboot的宠物店管理系统(源代码+数据库)087

基于Springboot的宠物店管理系统(源代码数据库)087 一、系统介绍 本系统分为管理员、店员两种角色 店员角色包含以下功能&#xff1a; 登录、宠物主人管理、宠物管理、宠物医疗管理、宠物销售管理、宠物寄养管理、宠物用品管理、宠物日常服务管理、宠物常见问题、个人中心、…

Appium Android ——利用 TestNG 并行执行用例

目录 前言&#xff1a; 一、测试类 二、连接两个 Android 设备或启动两个虚拟机 三、项目路径下新建两个 testng.xml 四、开启两个 appium server 五、导出依赖 六、执行测试 七、查看报告 前言&#xff1a; Appium是一个流行的移动应用自动化测试工具&#xff0c;…

RAID6故障导致分区打不开的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台infortrend存储&#xff0c;有一组由12块硬盘组建的RAID6&#xff0c;RAID6的所有空间划分给一个LUN并映射到WINDOWS系统上&#xff0c;WINDOWS系统上划分了一个GPT分区。 服务器故障&分析&#xff1a; 存储无法访问&#xff0c;经过检…

【代码随想录13】前 K 个高频元素

题目 给定一个非空的整数数组&#xff0c;返回其中出现频率前 k 高的元素。 示例 1: 输入: nums [1,1,1,2,2,3], k 2输出: [1,2] 示例 2: 输入: nums [1], k 1输出: [1] 提示&#xff1a; 你可以假设给定的 k 总是合理的&#xff0c;且 1 ≤ k ≤ 数组中不相同的元素…

北京汽车:传统车厂向“用户服务”转型的新范本

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 摘要&#xff1a;用户决定价值 英国大文豪狄更斯曾在《双城记》中说&#xff1a;“这是最好的时代&#xff0c;也是最坏的时代”。大浪淘沙之下&#xff0c;汽车产业…

C#为什么不能成为大学编程入门的首选?

大学编程入门不以C#作为首选的原因有多个因素。虽然C#是一种功能强大的编程语言&#xff0c;但在大学编程入门阶段&#xff0c;通常会选择其他语言作为首选&#xff0c;以下是一些可能的原因&#xff1a; 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 …

编程小白的自学笔记九(python爬虫入门+代码详解)

系列文章目录 编程小白的自学笔记八&#xff08;python中的多线程&#xff09; 编程小白的自学笔记七&#xff08;python中类的继承&#xff09; 编程小白的自学笔记六&#xff08;python中类的静态方法和动态方法&#xff09; 编程小白的自学笔记五&#xff08;Python类的…

【运维小知识】(一)——centos系统安装(小白入门级)

目录 1.制作系统U盘 2.安装centos系统 3.系统配置 3.1【语言】配置​编辑 3.2【软件选择】配置 3.3【安装位置】配置 3.4【主机名、root密码、网络】配置 1.制作系统U盘 首先下载软件ventoy&#xff0c;制作系统U盘&#xff0c;买个新U盘。先在笔记本电脑安装ventoy软件&a…