PySpark

简介

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是匹配整个字符串,找出全部匹配项

正则表达式的元字符匹配

正则字符:   \.   来匹配点本身

 

 

 

 

 递归

递归:方法(函数)自己调用自己的一种特殊编程写法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值