PySpark RDD 的使用

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"
    # 创建SparkContext对象(本地运行)
    conf = SparkConf().setAppName("Test").setMaster("local[*]")
    # 集群yarn运行
    # conf = SparkConf().setAppName("Test").setMaster("yarn")
    # 依赖文件同步提交
    # conf.set("spark.submit.pyFiles", 依赖文件或多个文件打包成的zip)
    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开始)

例:

PySpark RDD 的使用_第1张图片

tmp9C76

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布尔值

你可能感兴趣的:(大数据相关,大数据,spark,hadoop)