PySpark RDD 的使用
文章目录
- PySpark RDD 的使用
-
- 1.1 RDD的创建
- 1.2 RDD算子
- 1.3 常用Transformation算子
-
- m a p 算子 \textcolor{CornflowerBlue}{map算子} map算子
- f l a t M a p 算子 \textcolor{CornflowerBlue}{flatMap算子} flatMap算子
- r e d u c e B y K e y 算子 \textcolor{CornflowerBlue}{reduceByKey算子} reduceByKey算子
- m a p V a l u e s 算子 \textcolor{CornflowerBlue}{mapValues算子} mapValues算子
- g r o u p B y 算子 \textcolor{CornflowerBlue}{groupBy算子} groupBy算子
- F i l t e r 算子 \textcolor{CornflowerBlue}{Filter算子} Filter算子
- d i s t i n c t 算子 \textcolor{CornflowerBlue}{distinct算子} distinct算子
- u n i o n 算子 \textcolor{CornflowerBlue}{union算子} union算子
- j o i n 算子 \textcolor{CornflowerBlue}{join算子} join算子
- i n t e r s e c t i o n 算子 \textcolor{CornflowerBlue}{intersection算子} intersection算子
- g l o m 算子 \textcolor{CornflowerBlue}{glom算子} glom算子
- g r o u p B y K e y 算子 \textcolor{CornflowerBlue}{groupByKey算子} groupByKey算子
- s o r t B y 算子 \textcolor{CornflowerBlue}{sortBy算子} sortBy算子
- s o r t B y K e y 算子 \textcolor{CornflowerBlue}{sortByKey算子} sortByKey算子
- 1.4 常用Action算子
-
- c o u n t B y K e y 算子 \textcolor{CornflowerBlue}{countByKey算子} countByKey算子
- c o l l e c t 算子 \textcolor{CornflowerBlue}{collect算子} collect算子
- r e d u c e 算子 \textcolor{CornflowerBlue}{reduce算子} reduce算子
- f o l d 算子 \textcolor{CornflowerBlue}{fold算子} fold算子
- f i r s t 算子 \textcolor{CornflowerBlue}{first算子} first算子
- t a k e S a m p l e 算子 \textcolor{CornflowerBlue}{takeSample算子} takeSample算子
- t a k e O r d e r d 算子 \textcolor{CornflowerBlue}{takeOrderd算子} takeOrderd算子
- f o r e a c h 算子 \textcolor{CornflowerBlue}{foreach算子} foreach算子
- s a v e A s T e x t F i l e 算子 \textcolor{CornflowerBlue}{saveAsTextFile算子} saveAsTextFile算子
- 1.5 分区操作算子
-
- m a p P a r t i t i o n s 算子 \textcolor{CornflowerBlue}{mapPartitions算子} mapPartitions算子 - Transformation
- f o r e a c h P a r t i t i o n 算子 \textcolor{CornflowerBlue}{foreachPartition算子} foreachPartition算子 - Action
- p a r t i t i o n B y 算子 \textcolor{CornflowerBlue}{partitionBy算子} partitionBy算子 - Transformation
- r e p a r t i t i o n 算子 \textcolor{CornflowerBlue}{repartition算子} repartition算子 - Transformation
- c o a l e c s e 算子 \textcolor{CornflowerBlue}{coalecse算子} coalecse算子 - Transformation
1.1 RDD的创建
Spark RDD的程序入口对象是SparkContext对象,使用RDD需要先创建一个SparkContext对象
from pyspark import SparkConf, SparkContext
import os
if __name__ == '__main__':
os.environ['SPARK_HOME'] = '/opt/spark-3.2.3'
os.environ["PYSPARK_PYTHON"] = "/usr/bin/python3"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/usr/bin/python3"
os.environ["HADOOP_CONF_DIR"] = "/opt/hadoop-2.7.2"
conf = SparkConf().setAppName("Test").setMaster("local[*]")
sc = SparkContext(conf=conf)
随后我们可以选择两种RDD的创建方式
-
rdd = sc.parallelize(c: Iterable[T], numSlices: int | None = …) 本地对象转分布式RDD即手动创建
-
rdd = sc.textFile(name: str, minPartitions: int | None = …, use_unicode: bool = …) 读取文件或目录,本地、hdfs数据皆可
或 rdd = sc.wholeTextFiles(name: str, minPartitions: int | None = …, use_unicode: bool = …) 读取小文件或目录,本地、hdfs数据皆可
1.2 RDD算子
算子:分布式集合化对象的API叫做算子
- Transformation算子 返回值仍是一个RDD算子的,称之为转换算子
- Action算子 返回值不是RDD的就是Action算子
转换算子没有Action算子无法工作
1.3 常用Transformation算子
m a p 算子 \textcolor{CornflowerBlue}{map算子} map算子
功能:将RDD中的数据一条条按给定函数处理,返回RDD
例:words_with_one_rdd = words_rdd.map(lambda x: (x, 1)) # 将全是单词的RDD转换为(单词,1)的元组形式
f l a t M a p 算子 \textcolor{CornflowerBlue}{flatMap算子} flatMap算子
功能:对RDD先执行map操作,然后进行解除嵌套操作
解除嵌套:[[1, 2, 3], [4, 5, 6]] - > [1, 2, 3, 4, 5, 6]
r e d u c e B y K e y 算子 \textcolor{CornflowerBlue}{reduceByKey算子} reduceByKey算子
功能:针对KV型RDD,自动按照key分组,然后根据给定聚合逻辑。完成组内value的聚合
例:result_rdd = words_with_one_rdd.reduceByKey(lambda a, b: a + b) # 按照key分组,并加和key相同的
m a p V a l u e s 算子 \textcolor{CornflowerBlue}{mapValues算子} mapValues算子
功能:针对二元元组RDD,只对其Value进行map操作
g r o u p B y 算子 \textcolor{CornflowerBlue}{groupBy算子} groupBy算子
功能:将RDD的数据进行分组
groupyBy传入的函数的意思是按照谁来分组(返回谁即可)
例:result.groupBy(lambda t: t[0]) # 按照key来分组
后接rdd.map(lambda x: (x[0], list(x[1]))) 转换成[(key,list[]),]的形式
F i l t e r 算子 \textcolor{CornflowerBlue}{Filter算子} Filter算子
功能:过滤出想要的数据,返回值是true的得以保留,false的被丢弃
d i s t i n c t 算子 \textcolor{CornflowerBlue}{distinct算子} distinct算子
功能:对RDD数据进行去重,返回新RDD,一般当作无参
u n i o n 算子 \textcolor{CornflowerBlue}{union算子} union算子
功能:两个RDD合并成一个RDD返回,不去重
j o i n 算子 \textcolor{CornflowerBlue}{join算子} join算子
功能:对两个RDD执行join操作(可实现SQL的内/外连接),按照二元元组key来连接
用法:
-
rdd.join(other_rdd) # 内连接
-
rdd.leftOuterJoin(other_rdd) # 左外
-
rdd.rightOuterJoin(other_rdd) # 右外
i n t e r s e c t i o n 算子 \textcolor{CornflowerBlue}{intersection算子} intersection算子
功能:求两个RDD的交集,返回一个新的RDD
g l o m 算子 \textcolor{CornflowerBlue}{glom算子} glom算子
功能:将RDD的数据加上嵌套,按照分区分割
例:RDD[1, 2, 3, 4, 5]两个分区,glom后变成[ [1, 2, 3], [4, 5] ]
g r o u p B y K e y 算子 \textcolor{CornflowerBlue}{groupByKey算子} groupByKey算子
功能:针对KV型数据,自动按照key分组
用法:rdd.groupByKey()
s o r t B y 算子 \textcolor{CornflowerBlue}{sortBy算子} sortBy算子
功能:对RDD数据进行排序,基于你的排序依据
用法:
rdd.sortBy(func, ascending=False, numPartitions=1)
# func 按照什么规则排序, lambda x: x[1] 表示按第二列元素排序
# ascending True升序, False降序
# numPartitons:用多少分区排序,全局有序需设置为1
s o r t B y K e y 算子 \textcolor{CornflowerBlue}{sortByKey算子} sortByKey算子
功能:针对KV型,按照key进行排序
用法:
sortByKey(ascending=True, numPartitions=None, keyfunc=>)
# ascending True升序, False降序
# numPartitons:用多少分区排序,全局有序需设置为1
# keyfunc:在排序前对key进行处理,(k) -> U
1.4 常用Action算子
c o u n t B y K e y 算子 \textcolor{CornflowerBlue}{countByKey算子} countByKey算子
功能:统计key出现的次数
c o l l e c t 算子 \textcolor{CornflowerBlue}{collect算子} collect算子
功能:将RDD各个分区内的数据,统一收集到driver中,形成一个list对象
r e d u c e 算子 \textcolor{CornflowerBlue}{reduce算子} reduce算子
功能:对RDD数据集按照你传入的逻辑进行聚合
f o l d 算子 \textcolor{CornflowerBlue}{fold算子} fold算子
功能:接受传入逻辑进行聚合,聚合带有初始值,初始值作用在分区间和分区内
例:[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 以10为初始值累加聚合,分区1聚合得16,分区2聚合得25,分区3聚合得34,最终得到 16 + 25 + 34 + 10 = 85
f i r s t 算子 \textcolor{CornflowerBlue}{first算子} first算子
功能:取出RDD的第一个元素
t a k e S a m p l e 算子 \textcolor{CornflowerBlue}{takeSample算子} takeSample算子
功能:随机抽样RDD的数据
用法:
takeSample(参数1:True or False, 参数2: 采样数, 参数3:随机数种子)
# 参数1:True表示有放回抽样,False表示不放回抽样
# 参数2:抽样抽几个
# 参数3:随机数种子
t a k e O r d e r d 算子 \textcolor{CornflowerBlue}{takeOrderd算子} takeOrderd算子
功能:对RDD进行排序,并取前N个
用法:
takeOrderd(参数1, 参数2)
# 参数1:取几个
# 参数2:改变数据使顺序改变,底层依然按自然顺序升序排序(临时,不改变原数据)
# rdd.takeOrderd(3, lambda x: -x) 原数据按相反数排序,最大的变成最小的,即升序变成倒序
f o r e a c h 算子 \textcolor{CornflowerBlue}{foreach算子} foreach算子
功能:对RDD的每一个数据执行操作,没有返回值,经由executor执行
用法:
foreach(func)
# func: (T)->None
# rdd.foreach(lambda x: print(x * 10))
s a v e A s T e x t F i l e 算子 \textcolor{CornflowerBlue}{saveAsTextFile算子} saveAsTextFile算子
功能:将RDD的数据写入文本系统中,本地或hdfs,经由executor执行
1.5 分区操作算子
m a p P a r t i t i o n s 算子 \textcolor{CornflowerBlue}{mapPartitions算子} mapPartitions算子 - Transformation
功能:相比较map一个个传递数据,此算子一次传递一整个分区的数据,与map功能类似
例:rdd.mapPartitions(lambda ita: i*10 for i in ita )
f o r e a c h P a r t i t i o n 算子 \textcolor{CornflowerBlue}{foreachPartition算子} foreachPartition算子 - Action
功能:和普通foreach一致,一次处理的是一整个分区数据,无返回值
p a r t i t i o n B y 算子 \textcolor{CornflowerBlue}{partitionBy算子} partitionBy算子 - Transformation
功能:对RDD进行自定义分区操作
用法:
partitonBy(参数1, 参数2)
# 参数1:重新分区后有几个分区
# 参数2:自定义分区规则,函数传入(k) -> int 返回一个分区编号(从0开始)
例:
r e p a r t i t i o n 算子 \textcolor{CornflowerBlue}{repartition算子} repartition算子 - Transformation
功能:对RDD的分区执行重新分区(数量)
用法:
repartition(参数:分区数)
c o a l e c s e 算子 \textcolor{CornflowerBlue}{coalecse算子} coalecse算子 - Transformation
功能:对RDD的分区执行重新分区(数量),但有安全机制,增加分区要设定shuffer布尔值