PySpark入门
PySpark入门
- Apache Spark是用于大规模数据处理的统一分析引擎;简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据
- PySpark是由Spark官方开发的Python第三方库
基础准备
- 下载包
- cmd:pip install pyspark
* 配置pip全局镜像源:cmd:pip config --global set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
构建PySpark执行环境入口对象
- 想要使用PySpark库完成数据处理,首先需要构建一个执行环境入口对象
- PySpark的执行环境入口对象是:类SparkContext的类对象
# 导包
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()
PySpark流程:数据输入->数据处理计算->数据输出
数据输入
RDD对象
- PySpark支持多种数据的输入,在输入完成后,都会得到一个RDD类的对象
- RDD全称:弹性分布式数据集(Resilient Distributed Datasets)
- PySpark针对数据的处理,都是以RDD对象作为载体,即:
- 数据存储在RDD内
- 各类数据的计算方法,也是RDD的成员方法
- RDD的数据计算方法,返回值依旧是RDD对象
# PySpark支持通过SparkContext对象的parallelize成员方法,将list/tuple/set/dict/str转换为PySpark的RDD对象
rdd = sc.parallelize(数据容器对象)
# PySpark也支持通过SparkContext入口对象来读取文件,构建出RDD对象
rdd = sc.textFile(文件路径)
# 输出RDD的内容
print(rdd.collect())
数据计算
- RDD对象内置丰富的成员方法(算子)
* PySpark找不到Python解释器报错
import os
os.environ['PYSPARK_PYTHON'] = '电脑中PYTHON.EXE地址'
map算子
- map算子是将RDD的数据一条条处理(处理的逻辑:基于map算子中接收的处理函数),返回新的RDD
# 例
# 准备一个RDD
rdd = sc.parallelize([1,2,3,4,5])
# 通过map方法将全部数据都乘以10
rdd2 = rdd.map(lambda a:a*10)
print(rdd2.collect())
flatMap算子
- 对rdd执行map操作,然后进行解除嵌套操作
# 解除嵌套例
# 嵌套
list=[[1,2,3],[4,5,6],[7,8,9]]
# 解除嵌套
list=[1,2,3,4,5,6,7,8,9]
# 例
# 准备一个RDD
rdd = sc.parallelize(["itheima itcast 666","itheima itheima itcast","python itheima"])
# flatMap方法&与map方法对比
rdd2 = rdd.map(lambda x:x.split(" "))
rdd3 = rdd.flatMap(lambda x:x.split(" "))
print(rdd2.collect())
print(rdd3.collect())
reduceByKey算子
- 针对KV型RDD,自动按照key分组,然后根据提供的聚合逻辑,完成组内数据(value)的聚合操作
- reductByKey中接收的函数只负责聚合,不理会分组;分组是自动by key分组的
# 例:先按照a、b分组,再进行聚合运算
rdd = sc.parallelize([('a',2),('a',3),('b',4),('b',5),('a',6),('b',7),('b',8)])
rdd = rdd.reduceByKey(lambda a,b:a+b)
print(rdd.collect())
# 结果:[('b', 24), ('a', 11)]
filter算子
- 过滤想要的数据进行保留
# 保留偶数
rdd = sc.parallelize([1,2,3,4,5])
rdd = rdd.filter(lambda x:x%2==0)
print(rdd.collect())
distinct算子
- 对RDD数据进行去重,返回新RDD
- 新对象无序
# 例
rdd = sc.parallelize([1,2,2,3,3,4,5,6,6,7])
rdd = rdd.distinct()
print(rdd.collect())
sortBy算子
- 对RDD数据进行排序,基于你指定的排序依据
# 例
rdd = sc.parallelize([[1,2,3],[1,4,3],[1,3,3]])
# func表示按照哪个数据进行排序,ascending为False表示从大到小,numPartitions表示用多少分区排序
rdd = rdd.sortBy(lambda x:x[1],ascending=False,numPartitions=1)
print(rdd.collect())
数据输出
输出为PYTHON对象
collect算子
- 将RDD各个分区内的数据,统一收集到Driver中,形成一个list对象
rdd.collect()
reduce算子
- 对RDD数据集按照传入的逻辑进行聚合,返回PYTHON数据类型
rdd = sc.parallelize([1,2,3,4,5])
a = rdd.reduce(lambda a,b:a+b)
print(a)
print(type(a))
# 结果:15 类型:INT
take算子
- 取RDD的前N哥元素,组合成list返回
rdd = sc.parallelize([3,5,9,1,2,4,3])
a = rdd.take(5)
print(a)
# 结果:[3, 5, 9, 1, 2]
count算子
- 计算RDD内有多少条数据
rdd = sc.parallelize([3,5,9,1,2,4,3])
a = rdd.count()
print(a)
print(type(a))
# 结果:7 类型:INT
输出到文件中
savaAsTextFile算子
- 将RDD的数据写入到文本文件中
- 支持本地写出,hdfs等文件系统
rdd = sc.parallelize([[3,5,9,1,2,4,3]])
rdd.saveAsTextFile("E:/1")
# 产生文件数取决于有几个分区;分区默认取决于CPU核心数,部分分区文件可能不含数据
# ------------------------------------------------------------------------------
# 设置分区
# 方法一 SparkConf对象设置属性全局并行度为1:
conf.set("spark.default.parallelism","1") #SPARK默认并行度
# 方法二 创建RDD的时候设置
rdd = sc.parallelize([1,2,3,4,5],numSlices=1)
rdd = sc.parallelize([1,2,3,4,5],1)
-
依赖HADOOP框架,需要配置依赖:
-
下载HADOOP安装包
-
解压
-
os.environ['HADOOP_HOME']='HADOOP解压文件夹路径' -
下载winutils.exe并放入Hadoop解压文件夹的bin目录内
-
下载Hadoop.dll并放入:C:/Windows/System32/文件夹中
-
浙公网安备 33010602011771号