SPARK、PYSPARK介绍
了解什么是Spark、pySpark
定义:Apache Spark是用于大规模数据(Large scale data)处理的统一(unified)分析引擎
简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据
python on Spark
Spark作为全球顶级的分布式计算框架,支持众多的编程语言进行开发,而python语言,则是Spark重点支持的方向
pySpark
Spark对python语言的支持,重点体现在,python第三方库:PySpark之上
PySpark是由Spark官方开发的Python语言第三方库
Python开发者可以使用pip程序快速安装PySpark并像其它三方库那样直接使用
作为python库进行数据处理
PySpark
提交至Spark集群进行分布式集群计算
基础准备
PySpark库的安装
在命令提示符(Mac终端)程序内,输入:
pip install pyspark #或者使用国内镜像源(清华大学源) pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark
PySpark执行环境入口对象的构建
使用PySpark库完成数据处理,首先需要构建一个执行环境入口对象
PySpark的执行环境入口对象是:类Spark Context的类对象
# 导包
from pyspark import SparkConf, SparkContext
# 创建SparkContext类对象
#setMaster("loca[*]") ---spark运行模式 loca[*] -----本地、单机模式
#setAppName("test_spark_app") -----给当前的spark设置app名称
conf = SparkConf().setMaster("loca[*]").setAppName("test_spark_app")
# 基于SparkConf类对象创建SparkContext类对象
sc = SparkContext(conf=conf)
# 打印PySpark的运行版本
print(sc.version)
# 停止SparkContext对象的运行版本(停止PySpark程序)
sc.stop()
PySpark的编程模型
SparkContext类对象,是PySpark编程中一切功能的入口
PySpark的编程,主要分为三步骤: 1.数据输入
通过SparkContext类对象的成员方法完成数据的读取操作读取后得到RDD类对象
2.数据处理计算
通过RDD类对象的成员方法完成各种数据计算的需求
3.数据输出
将处理完成后的RDD类对象调用各种成员方法完成写出文件、转换为list等操作
通过SparkContext对象,完成数据输入
输入数据后得到RDD类对象,对RDD类对象进行迭代计算
最终通过RDD类对象的成员方法,完成数据输出工作
数据输入
RDD类对象
PySpark支持多种数据的输入,在输入完成后,都会得到一个:RDD类对象
RDD全称:弹性分布式数据集(Resilient Distributed Datasets)
PySpark针对数据的处理,都是以RDD类对象作为载体,即:
数据存储在RDD内
各类数据的计算方法,也都是RDD的成员方法
RDD的数据计算方法,返回值依旧是RDD类对象
PySpark输入方法
PySpark数据容器转RDD对象
PySpark支持通过PySpark Context对象的parallelize成员方法,将:
list、tuple、set、dict、str。。转换为PySpark的RDD对象
注意⚠️:
字符串会被拆分出一个个的字符,存入对象
字典仅有key会被存入RDD对象
# 数据输入
# 导包
from pyspark import SparkContext, SparkConf
# 创建SparkContext类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")
# 基于SparkConf类对象创建SparkContext类对象
sc = SparkContext(conf=conf)
# 第一种方法
# 通过parallelize方法将python对象加载待spark内,成为RDD对象
rdd1 = sc.parallelize([1, 2, 3, 4, 5]) # 列表
rdd2 = sc.parallelize((1, 2, 3, 4, 5)) # 元祖
rdd3 = sc.parallelize("abcd") # 字符串
rdd4 = sc.parallelize({1, 2, 3, 4, 5}) # 集合
rdd5 = sc.parallelize({"key1": "value"}) # 字典
# 如果要查看RDD里面有什么内容,需要用collect()方法
print(rdd1.collect())
# 第二种方法
# 用过textFile方法,读取文件数据加载Spark内,成为RDD对象
rdd = sc.textFile("/Users/a123/Documents/大数据与应用技术竞赛/assets/hello.rtf")
print(red.colleect)
sc.stop()
数据计算
Map 方法
PySpark的数据计算,都是基于RDD对象来进行的,自然是依赖,RDD对象内置丰富的:成员方法(算子)
map算子
功能:map算子,是将RDD的数据一条条处理(处理的逻辑基于map算子中接收的处理函数),返回新的RDD
语法:
rdd.map(func) #func: f:(T) -> U #f: 表示这是一个函数(方法) #(T) -> U 表示的是方法的定义: # () 表示传入参数, (T)表示 传入1个参数,()表示没有传入参数 #T 是泛型的代称,在这里表示 任意类型 #U 也是泛型代称,在这里表示 任意类型 # -> 表示返回值 #(T) -> U 总结意思:这是一个方法,这个方法接收一个参数传入,传入参数类型不限,返回一个返回值,返回值泛型不限 #(A) -> A 总结意思:这是一个方法,这个方法接收一个参数传入,传入参数类型不限,返回一个返回值,返回值和传入参数类型一致
"""
数据计算
map方法
"""
from pyspark import SparkConf, SparkContext
import os
os.environ["PYSPARK_PYTHON"] = "/Users/a123/Documents/大数据与应用技术竞赛/数据挖掘/pyspark/venv/bin/python"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 初始RDD
rdd = sc.parallelize([1, 2, 3, 4, 5])
# map方法将全部数据都乘以10
def func(data):
return data * 10
rdd2 = rdd.map(func)
print(rdd2)
flatmap方法
flatmap算子
功能:对rdd执行map操作,然后进行解除嵌套操作
解除嵌套
#嵌套的list
lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
#如果解除嵌套
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
flatmap算子
"""
from pyspark import SparkContext, SparkConf
if __name__ == '__main__':
# 构建Spark执行环境
conf = SparkConf().setAppName("create rdd").setMaster("local[*]")
sc = SparkContext(conf=conf)
rdd = sc.parallelize(["a, b, c", "a, c, e", "e, c, a"])
# 按照空格切分数据后,提取rdd数据
rdd2 = rdd.map(lambda x: x.split(" "))
print(rdd2.collect())
# 按照空格切分数据后,解除嵌套
rdd2 = rdd.flatmap(lambda x: x.split(" "))
print(rdd2.collect())
reduce Bykey方法
redece Bykey算子
功能:针对KV型RDD,自动按照key分组,然后根据你提供的聚合逻辑,完成组内数据(value)
KV型RDD:二元元祖
的聚合操作
用法:
rdd.reduceBykey(func)
# func:(v, v) --> v
#接受2个传入参数(类型要一致,返回一返回值,类型和传入要一致.)
"""
reduce Bykey算子
"""
from pyspark import SparkContext, SparkConf
import os
os.environ["PYSPARK_PYTHON"] = "/Users/a123/Documents/大数据与应用技术竞赛/数据挖掘/pyspark/venv/bin/python"
# 构建Spark执行环境
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
rdd = sc.parallelize([('a', 1), ('a', 1), ('b', 1), ('b', 1), ('b', 1)])
result = rdd.reduceByKey(lambda a, b: a + b)
print(result.collect())
注意:reduceBykey中接收函数,只负责聚合,不理会分组,分组是自动bykey来分组的
reduceBykey中的聚合逻辑:
比如,有[1, 2, 3, 4, 5], 然后聚合函数是:lambda a, b: a + b
接收一个处理函数,对数据进行两两计算
练习
filter方法
distinct方法
sortBy方法
练习