文章目录
基础准备
首先需要安装pyspark库
cmd
pip install pyspark
构建pyspark执行环境入口对象
pyspark的执行环境入口对象是:类SparkContext的类对象
python
# 导包
from pyspark import SparkConf, SparkContext
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于Sparkconf类对象创建SparkContext类对象
sc = SparkContext(conf=conf)
# 打印PySpark的运行版本
print(sc.version)
# 停止SparkContext对象的运行(停止PySpark程序)
sc.stop()



数据输入
RDD对象
pyspark支持多种数据的输入,再输入完成后,都会得到一个RDD对象。
RDD全程:弹性分布式数据集(Resilient Distributed Datasets)
pyspark针对数据的处理,都是以RDD对象作为载体
- 数据存储在RDD内
- 各类数据的计算方法,也都是RDD的成员方法
- RDD的数据计算方法,返回值依旧是RDD对象
pyspark支持通过SparkContext对象的parallelize
成员方法,将lsit
、tuple
、set
、dict
、str
、转换为PySpark的RDD对象
python
mylist = [1, 2, 3, 4]
rdd = sc.parallelize(mylist)
print(type(rdd))
print(rdd.collect())

读取文件转RDD对象
SparkContext对象中提供了一个textFile
方法
python
rdd = sc.textFile(File_path)

数据计算
map方法
pyspark的数据计算都是基于RDD对象来进行的,更具体地是依赖于RDD对象内置丰富的成员方法(算子)
map算子:map算子是将RDD的数据一条条处理(处理逻辑基于map算子中接收到的处理函数),返回新的RDD
语法:
python
mylist = [1, 2, 3, 4, 5]
rdd = sc.parallelize(mylist)
def func(data):
return data * 10
rdd2 = rdd.map(func)
print(rdd2.collect())
map中传递一个函数,并且将rdd中的每一个元素都传递给这个函数去计算,这个函数需要返回一个元素,函数需要根据具体逻辑。
map中的函数是(T->U),这表示的是传入参数和返回值不需要类型一样
python
# 链式调用
rdd3 = rdd.map(lambda x: x * 10).map(lambda x: x + 5)
print(rdd3.collect())

flatMap方法
功能:对rdd执行map操作,然后进行解除嵌套
操作
python
# 嵌套了list
lst = [[1, 2, 3], [4, 5, 6]. [7, 8, 9]]
# 如果解除了嵌套
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
python
# 准备一个RDD
rdd = sc.parallelize(["1 1 1", "2 2 2", "3 3 3"])
# 需求将RDD数据里面的一个个单词提取出阿里
rdd2 = rdd.map(lambda x: x.split(" "))
print(rdd2.collect())

python
# 准备一个RDD
rdd = sc.parallelize(["1 1 1", "2 2 2", "3 3 3"])
# 需求将RDD数据里面的一个个单词提取出阿里
rdd2 = rdd.flatMap(lambda x: x.split(" "))
print(rdd2.collect())


reduceByKey方法
reduceByKey算子 :针对KV型 RDD,自动按照key分组 ,然后根据提供的聚合逻辑,完成组内数据(value)的聚合操作
- KV数据就是二元元组
- spark中对二元元组的划分,第一个元素叫k,第二个元素叫v
python
rdd.reduceByKey(func)
# func:(V, V) -> V
#接受2个传入参数(类型要一致),返回一个返回值,类型和传入要求一致
python
# 准备一个RDD
rdd = sc.parallelize([('男', 99), ('男', 88), ('女', 88), ('女', 66)])
# 需求将RDD数据里面的一个个单词提取出阿里
rdd2 = rdd.reduceByKey(lambda a, b: a + b)
print(rdd2.collect())

filter方法
功能:过滤想要的数据进行保留
python
radd.filter(func)
# func: (T) -> bool 传入1个参数进来随意类型,返回值必须是True or False
案例:过滤掉奇数,留下偶数
python
# 准备一个RDD
rdd = sc.parallelize([1, 2, 3, 4, 5, 6])
def func(a):
if a % 2 == 0:
return True
else:
return False
rdd2 = rdd.filter(func)
print(rdd2.collect())

distinct方法
功能:对RDD数据进行去重,返回新的RDD
语法:
python
# 无需传参
rdd.distinct()
python
# 准备一个RDD
rdd = sc.parallelize([1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 5, 6])
rdd2 = rdd.distinct()
print(rdd2.collect())

sortBy方法
功能:对RDD数据进行排序,基于你指定的排序依据
语法:
python
rdd.sortBy(func, ascending=False,bunPartitions=1)
# func:(T) -> U:告知按照rdd中的哪个数据进行排序,比如lambda x: x[1] 表示按照rdd中的第二列元素进行排序
# ascending True 升序 False 降序
# numPartitions:用多少分区排序

数据输出
collect算子
功能:将RDD各个分区内的数据,同意收集到Driver中,形成一个List对象
用法:
python
rdd.collect()
# 返回值是一个list
reduce算子
功能:对RDD数据集按照传入的逻辑进行聚合
语法:
python
rdd.reduce(func)
# func:(T, T) -> T
# 2参数传入 1个返回值, 返回值和参数要求类型一致
代码:
python
rdd =sc.parallelize(range(1, 10))
# 将rdd的数据机型累加求和
print(rdd.reduce(lambda a, b: a + b))
take算子
功能:取RDD的前N个元素,组合成list返回
用法:
python
sc.parallelize([3, 2, 1, 4, 5, 6]).take(5)
count算子
python
num_count = sc.parallelize([3, 2, 1, 4, 5, 6]).count()
#

saveAsTextFile算子
功能:将RDD的数据写入文本文件中,支持本地写粗,hdfs等文件系统
python
rdd = sc.parallelize([1, 2, 3, 4 ,5])
rdd.savaAsTextFile(file_name)
修改rdd分区为1
方式1:SparkConf对象设置属性全局并行度为1
python
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
conf.set('spark.default.parallelism', 1)
sc = SparkContext(conf=conf)
方式2, 创建rdd的时候设置(parallelize方法传入num Slices参数为1)
python
rdd1 = sc.parallelize([1, 2, 3, 4, 5], numSlices=1)
# numSlices可以省略
rdd1 = sc.parallelize([1, 2, 3, 4, 5], 1)