简介
Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算海量数据。
而PySpark则是将python作为编程语言进行开发。
PySpark有两种使用方式:
(1)作为python的库进行数据处理
(2)提交至spark集群进行分布式集群计算
PySpark安装
pip install pyspark
因为pyspark是分布式库,所以可能会存在找不到python解释器的情况。
解决方法:将python解释器加入到环境变量当中
import os
os.environ['PYSPARK_PYTHON'] = "python解释器的位置"
这里介绍几个pyspark中的类:
(1)SparkConf类:SparkConf包含了Spark集群配置的各种参数。
创建一个类对象:
conf = SparkConf.setMaster("local").setAppName("My APP")
//local代表在本地运行,appname设置将在spark Web UI中显示的应用程序的名称。
//还会有其他的参数,SparkSession.builder() 创建此方法用于构造SparkSession。
Config 设置使用此方法设置的配置选项会自动传递到'SparkConf'和'SparkSession'自己的配置,它的参数由键值对组成。
enableHiveSupport启用Hive支持,类似于HiveContext创建了sparkSession,我们可以用它来读取数据。
getOrCreate()方法表示有就拿过来,没有就创建,类似于单例模式。
(2)SparkContext类:实例化一个SparkConf对象
sc = SparkContext(conf = conf)
sc.version //打印pyspark的运行版本
sc.stop //停止pyspark程序
数据输入
pyspark支持多种 数据的输入 ,输入完成之后都会得到一个RDD(弹性分布式数据集)的对象。后续对于数据的处理都是以RDD对象作为载体,即数据存储到RDD中,各类数据的计算方法也是RDD的成员方法,RDD的数据计算方法返回值依然是RDD的数据类型。
//将不同的数据类型转化成RDD对象
rdd = sc.parallelize(数据容器对象)
//输出rdd中的内容
print(rdd.collect())
//或者使用textFile的方法,读取文件数据加载到spark中成为RDD对象。
rdd = sc.textFile(''文件地址 ")
数据计算
map()方法
功能:将RDD的数据一条条处理(处理的逻辑基于map算子中接受的处理函数),返回新的RDD
rdd.map(func)
//其中func: f:(T) ——> U
//(T) ——> U这是一个方法,这个方法接受一个参数传入,传入参数类型不限,返回一个返回值,返回类型不限。
(A) ——> A这是一个方法,这个方法接受一个参数传入,传入参数类型不限,返回一个返回值,返回值和传入参数类型一致。
flatMap()方法
功能:在map函数处理的基础上,再进行一次展平操作
reduceByKey()算子
功能:针对KV型RDD(二元元组),自动按照key分组,然后根据你提供的聚合逻辑,完成组内数据(value)的聚合操作。
rdd.reduceByKey(func)
# func:(v,v)->v
#接受两个传入参数(类型要一致),返回一个返回值,类型和传入要求一致。reduceByKey中接收的函数,只负责聚合,不理会分组。
filter()方法
功能:过滤,对想要保留的数据进行保留。返回为True的保留,返回为False的舍弃。
distinct()方法
功能:对RDD数据进行去重,返回仍是RDD数据。
不需要传入参数
sortBy()算子
功能:排序方法,按照给定的排序依据进行排序。
rdd.sortBy(func,ascending = False, numPartitions = 1)
#func传入的是参数
#ascending = False是降序,True是升序
# numPartitions = 1 代表多少分区进行排列,默认为1就可以
数据输出(输出成python的对象或保存到文件中)
collect()算子
rdd.collect() #返回的是一个列表
reduce()算子
功能:将RDD的数据按照你传入的逻辑进行聚合。
用法类似于reduceByKey()
take()算子
功能:取出RDD数据中的前n个数据组成list进行返回。
count()算子
功能:统计RDD数据中包含多少条数据,返回的是一个数值。
saveAsTextFile()函数
功能:将RDD数据保存到txt文件中。
注意:调用保存文件的算子,需要配置Hadoop:
1、下载Hadoop并解压。
2、os.environ['HADOOP_HOME'] = 'Hadoop的解压位置'
3、下载winutils并解压到Hadoop的位置
4、下载hadoop.dll并解压到‘C:/Windows/System32/’
但是RDD数据通常存在多个分区,解决办法:
闭包
定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个外部函数变量的内部函数称为闭包。
优点:
1、无需定义全局变量即可实现通过函数,持续的访问、修改某个值
2、闭包的使用的变量的所用与在函数内,难以被错误的调用和修改
缺点:
由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存。
装饰器
装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。
1、因为装饰器本身就是一种闭包,所以可以按照闭包的写法进行定义。
2、装饰器的语法糖写法。
def outer(func):
def inner():
print("我睡觉了")
func()
print("我起床了")
return inner
@outer
def sleep():
import random
import time
print("睡眠中")
time.sleep(random.randint(1,5))
sleep()
在上述代码中,目的是想要为sleep函数增加修饰的新功能,就可以通过装饰器来进行实现。输出的结果就是:我睡觉了 睡觉中 我起床了
单例模式
我们知道,当我们实例化一个类的时候,就会创造一个对象。
但在某些场景下,我们需要一个类无论获取多少次类对象,都仅仅提供一个具体的实例用以节省创建类对象的开销和内存开销。比如某些工具类,仅需要1个实例,即可在各处使用。这就是单例模式所要实现的效果。
工厂模式
当需要大量创建一个类的实例的时候,可以使用工厂模式。即从原生的使用类的构造去创建对象的形式 迁移到,基于工厂提供的方法 去创建对象的形式。
正则表达式
正则表达式:字符串定于规则,并通过规则去验证字符串是否匹配。
re模块中的正则匹配的基础方法:match,search,findall
re.match(匹配规则,被匹配字符串)
从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配信息),匹配不成功则为空。
search(匹配规则, 被匹配的字符串)
#搜索整个字符串,找到匹配的。从前往后找,找到第一个之后就停止,不会继续向后找。
findall是匹配整个字符串,找出全部匹配项
正则表达式的元字符匹配
正则字符: \. 来匹配点本身
递归
递归:方法(函数)自己调用自己的一种特殊编程写法。