我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Python】PySpark 数据计算 ③ ( RDD#reduceByKey 函数概念 | RDD#reduceByKey 方法工作流程 | RDD#reduceByKey 语法 | 代码示例 )

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Python】PySpark 数据计算 ③ ( RDD#reduceByKey 函数概念 | RDD#reduceByKey 方法工作流程 | RDD#reduceByKey 语法 | 代码示例 )

文章目录





一、RDD#reduceByKey 方法




1、RDD#reduceByKey 方法概念


RDD#reduceByKey 方法 是 PySpark 中 提供的计算方法 ,

  • 首先 , 对 键值对 KV 类型 RDD 对象 数据相同 键 key 对应的 值 value 进行分组 ,
  • 然后 , 按照 开发者 提供的 算子 ( 逻辑 / 函数 ) 进行 聚合操作 ;

上面提到的 键值对 KV 型 的数据 , 指的是 二元元组 , 也就是 RDD 对象中存储的数据是 二元元组 ;

元组 可以看做为 只读列表 ;

二元元组 指的是 元组 中的数据 , 只有两个 , 如 :

("Tom", 18)("Jerry", 12)

PySpark 中 , 将 二元元组 中

  • 第一个元素 称为 键 Key ,
  • 第二个元素 称为 值 Value ;

按照 键 Key 分组 , 就是按照 二元元组 中的 第一个元素 的值进行分组 ;

[("Tom", 18), ("Jerry", 12), ("Tom", 17), ("Jerry", 13)]

将上述列表中的 二元元组 进行分组 , 按照 二元元组 第一个元素进行分组 ,

  • ("Tom", 18)("Tom", 17) 元组分为一组 , 在这一组中 , 将 18 和 17 两个数据进行聚合 , 如 : 相加操作 , 最终聚合结果是 35 ;
  • ("Jerry", 12)("Jerry", 13) 分为一组 ;

如果 键 Key 有 A, B, C 三个 值 Value 要进行聚合 , 首先将 A 和 B 进行聚合 得到 X , 然后将 X 与 C 进行聚合得到新的值 Y ;


具体操作方法是 : 先将相同 键 key 对应的 值 value 列表中的元素进行 reduce 操作 , 返回一个减少后的值,并将该键值对存储在RDD中 ;


2、RDD#reduceByKey 方法工作流程


RDD#reduceByKey 方法 工作流程 : reduceByKey(func) ;

  • 首先 , 对 RDD 对象中的数据 分区 , 每个分区中的相同 键 key 对应的 值 value 被组成一个列表 ;
  • 然后 , 对于 每个 键 key 对应的 值 value 列表 , 使用 reduceByKey 方法提供的 函数参数 func 进行 reduce 操作 , 将列表中的元素减少为一个 ;
  • 最后 , 将减少后的 键值对 存储在新的 RDD 对象中 ;

3、RDD#reduceByKey 函数语法


RDD#reduceByKey 语法 :

reduceByKey(func, numPartitions=None)
  • func 参数 : 用于聚合的函数 ;
  • numPartitions 是可选参数 , 指定 RDD 对象的分区数 ;

传入的 func 函数的类型为 :

(V, V) -> V

V 是泛型 , 指的是任意类型 , 上面的 三个 V 可以是任意类型 , 但是必须是 相同的类型 ;

该函数 接收 两个 V 类型的参数 , 参数类型要相同 , 返回一个 V 类型的返回值 , 传入的两个参数和返回值都是 V 类型的 ;


使用 reduceByKey 方法 , 需要保证函数的

  • 可结合性 ( associativity ) : 将两个具有 相同 参数类型 和 返回类型 的方法结合在一起 , 不会改变它们的行为的性质 ; 两个方法结合使用的结果与执行顺序无关 ;
  • 可重入性 ( commutativity ) : 在多任务环境下 , 一个方法可以被多个任务调用 , 而不会出现数据竞争或状态错误的问题 ;

以便在并行计算时能够正确地聚合值列表 ;





二、代码示例 - RDD#reduceByKey 方法




1、代码示例


在下面的代码中 , 要处理的数据是 列表 , 列表元素是 二元元组 ;

[("Tom", 18), ("Tom", 3), ("Jerry", 12), ("Jerry", 21)]

对 值 Value 进行的聚合操作就是相加 , 也就是把同一个 键 Key 下的多个 Value 值 进行相加操作 ,

# 应用 reduceByKey 操作,将同一个 Key 下的 Value 相加rdd2 = rdd.reduceByKey(lambda a, b: a + b)

代码示例 :

"""PySpark 数据处理"""# 导入 PySpark 相关包from pyspark import SparkConf, SparkContext# 为 PySpark 配置 Python 解释器import osos.environ['PYSPARK_PYTHON'] = "D:/001_Develop/022_Python/Python39/python.exe"# 创建 SparkConf 实例对象 , 该对象用于配置 Spark 任务# setMaster("local[*]") 表示在单机模式下 本机运行# setAppName("hello_spark") 是给 Spark 程序起一个名字sparkConf = SparkConf() \    .setMaster("local[*]") \    .setAppName("hello_spark")# 创建 PySpark 执行环境 入口对象sparkContext = SparkContext(conf=sparkConf)# 打印 PySpark 版本号print("PySpark 版本号 : ", sparkContext.version)# 将 字符串列表 转为 RDD 对象rdd = sparkContext.parallelize([("Tom", 18), ("Tom", 3), ("Jerry", 12), ("Jerry", 21)])# 应用 reduceByKey 操作,将同一个 Key 下的 Value 相加rdd2 = rdd.reduceByKey(lambda a, b: a + b)# 打印新的 RDD 中的内容print(rdd2.collect())# 停止 PySpark 程序sparkContext.stop()

2、执行结果


D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Client.py23/08/01 10:16:04 WARN Shell: Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. -see https://wiki.apache.org/hadoop/WindowsProblemsSetting default log level to "WARN".To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).23/08/01 10:16:04 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablePySpark 版本号 :  3.4.1D:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spillingD:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spillingD:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spillingD:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spillingD:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spilling[('Jerry', 33), ('Tom', 21)]Process finished with exit code 0

在这里插入图片描述





三、代码示例 - 使用 RDD#reduceByKey 统计文件内容




1、需求分析


给定一个 文本文件 word.txt , 文件内容为 :

Tom JerryTom Jerry TomJack Jerry

在这里插入图片描述

读取文件中的内容 , 统计文件中单词的个数 ;

思路 :

  • 读取数据到 RDD 中 ,
  • 然后 按照空格分割开 再展平 , 获取到每个单词 ,
  • 根据上述单词列表 , 生成一个 二元元组 列表 , 列表中每个元素的 键 Key 为单词 , 值 Value 为 数字 1 ,
  • 对上述 二元元组 列表 进行 聚合操作 , 相同的 键 Key 对应的 值 Value 进行相加 ;

2、代码示例


首先 , 读取文件 , 将 文件转为 RDD 对象 , 该 RDD 对象中 , 列表中的元素是 字符串 类型 , 每个字符串的内容是 整行的数据 ;

# 将 文件 转为 RDD 对象rdd = sparkContext.textFile("word.txt")# 内容为 ['Tom Jerry', 'Tom Jerry Tom', 'Jack Jerry']

然后 , 通过 flatMap 展平文件, 先按照 空格 切割每行数据为 字符串 列表 , 然后展平数据解除嵌套 ;

# 通过 flatMap 展平文件, 先按照 空格 切割每行数据为 字符串 列表#   然后展平数据解除嵌套rdd2 = rdd.flatMap(lambda element: element.split(" "))# 内容为 : ['Tom', 'Jerry', 'Tom', 'Jerry', 'Tom', 'Jack', 'Jerry']

再后 , 将 rdd 数据 的 列表中的元素 转为二元元组 , 第一个元素设置为 单词 字符串 , 第二个元素设置为 1

# 将 rdd 数据 的 列表中的元素 转为二元元组, 第二个元素设置为 1rdd3 = rdd2.map(lambda element: (element, 1))# 内容为 [('Tom', 1), ('Jerry', 1), ('Tom', 1), ('Jerry', 1), ('Tom', 1), ('Jack', 1), ('Jerry', 1)]

最后 , 应用 reduceByKey 操作 , 对相同 键 Key 对应的 值 Value 进行聚合操作 , 将同一个 Key 下的 Value 相加, 也就是统计 键 Key 的个数 ;

# 应用 reduceByKey 操作,#   将同一个 Key 下的 Value 相加, 也就是统计 键 Key 的个数rdd4 = rdd3.reduceByKey(lambda a, b: a + b)# [('Tom', 3), ('Jack', 1), ('Jerry', 3)]

代码示例 :

"""PySpark 数据处理"""# 导入 PySpark 相关包from pyspark import SparkConf, SparkContext# 为 PySpark 配置 Python 解释器import osos.environ['PYSPARK_PYTHON'] = "D:/001_Develop/022_Python/Python39/python.exe"# 创建 SparkConf 实例对象 , 该对象用于配置 Spark 任务# setMaster("local[*]") 表示在单机模式下 本机运行# setAppName("hello_spark") 是给 Spark 程序起一个名字sparkConf = SparkConf() \    .setMaster("local[*]") \    .setAppName("hello_spark")# 创建 PySpark 执行环境 入口对象sparkContext = SparkContext(conf=sparkConf)# 打印 PySpark 版本号print("PySpark 版本号 : ", sparkContext.version)# 将 文件 转为 RDD 对象rdd = sparkContext.textFile("word.txt")print("查看文件内容 : ", rdd.collect())# 通过 flatMap 展平文件, 先按照 空格 切割每行数据为 字符串 列表#   然后展平数据解除嵌套rdd2 = rdd.flatMap(lambda element: element.split(" "))print("查看文件内容展平效果 : ", rdd2.collect())# 将 rdd 数据 的 列表中的元素 转为二元元组, 第二个元素设置为 1rdd3 = rdd2.map(lambda element: (element, 1))print("转为二元元组效果 : ", rdd3.collect())# 应用 reduceByKey 操作,#   将同一个 Key 下的 Value 相加, 也就是统计 键 Key 的个数rdd4 = rdd3.reduceByKey(lambda a, b: a + b)print("最终统计单词 : ", rdd4.collect())# 停止 PySpark 程序sparkContext.stop()

执行结果 :

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Client.py23/08/01 11:25:24 WARN Shell: Did not find winutils.exe: java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. -see https://wiki.apache.org/hadoop/WindowsProblemsSetting default log level to "WARN".To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).23/08/01 11:25:24 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicablePySpark 版本号 :  3.4.1查看文件内容 :  ['Tom Jerry', 'Tom Jerry Tom', 'Jack Jerry']查看文件内容展平效果 :  ['Tom', 'Jerry', 'Tom', 'Jerry', 'Tom', 'Jack', 'Jerry']转为二元元组效果 :  [('Tom', 1), ('Jerry', 1), ('Tom', 1), ('Jerry', 1), ('Tom', 1), ('Jack', 1), ('Jerry', 1)]D:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spillingD:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spillingD:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spillingD:\001_Develop\022_Python\Python39\Lib\site-packages\pyspark\python\lib\pyspark.zip\pyspark\shuffle.py:65: UserWarning: Please install psutil to have better support with spilling最终统计单词 :  [('Tom', 3), ('Jack', 1), ('Jerry', 3)]Process finished with exit code 0

在这里插入图片描述

来源地址:https://blog.csdn.net/han1202012/article/details/132034137

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Python】PySpark 数据计算 ③ ( RDD#reduceByKey 函数概念 | RDD#reduceByKey 方法工作流程 | RDD#reduceByKey 语法 | 代码示例 )

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录