pyspark学习

由于公司的项目需要用pyspark做数据清洗等工作,于是现学现用,也有很多不懂的地方,如果文章里面有什么总结得有问题的,欢迎大家指出。

更详细的介绍也可以参考PySpark教程:使用Python学习Apache Spark

  • 一. pyspark简介

1. pyspark是什么

要学习pyspark,肯定首先要知道pyspark是什么。

Apache Spark是用Scala编程语言编写的。为了让Spark支持Python,Apache Spark社区发布了一个工具PySpark,从而可以以交互的方式使用Python编写Spark程序。

然后需要了解RDD是怎么一回事。

2. RDD是什么

这部分内容参考了另一篇文章:pyspark的使用和操作(基础整理)

pyspark里最核心的模块是SparkContext(简称sc),最重要的数据载体是RDD。RDD就像一个NumPy array或者一个Pandas Series(NumPy和Pandas都是Python的包),可以视作一个有序的item集合。只不过这些item并不存在driver端的内存里,而是被分割成很多个partitions,每个partition的数据存在集群的executor的内存中。

总结一下,在pyspark中创建RDD有两种方法,一种是并行化一个列表,一种是直接读取文件

但是所有工作的前提是初始化SparkSession,SparkSession是Spark 2引入的新概念。SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。spark2将SparkConf、SparkConText、SQLContext和HiveContext和StreamingContext进行了组合。所以在SQLContext和HiveContext等上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了SparkContext,所以计算实际上是由SparkContext完成的。

我的平台装的是spark2.2,可以用spark2的写法,但spark1的写法也不会报错。

#spark2的写法
from pyspark.sql import SparkSession
from pyspark import SparkContext
spark = SparkSession.builder.appName("Project").getOrCreate()
sc = SparkContext.getOrCreate()

#spark1的写法
#from pyspark import SparkContext as sc
#from pyspark import SparkConf
#conf = SparkConf().setAppName("Project").setMaster("local[*]")#代码只在本地运行
##conf = SparkConf().setAppName("lg").setMaster("spark://192.168.10.10:7077")#代码在master上运行,设置master的ip和端口
#sc = sc.getOrCreate(conf)

##方法一 并行化一个集合
#使用sc.parallelize可以把Python list,NumPy array或者Pandas Series,Pandas DataFrame转成Spark RDD。
rdd1 = sc.parallelize([('苹果', 8), ('香蕉', 4), ('葡萄',6), ('梨', 3), ('火龙果', 9)])
rdd1
#ParallelCollectionRDD[2] at parallelize at PythonRDD.scala:195

##方法二 读取文件
rdd2 = sc.textFile("c1.py")#读入一个文件
rdd3 = sc.wholeTextFiles("c1.py")#读入整个文件夹的所有文件,RDD中的每个item实际上是一个形如(文件名,文件所有内容)的元组。
rdd2
#Output:c1.py MapPartitionsRDD[4] at textFile at NativeMethodAccessorImpl.java:0

#getNumPartitions()方法可以查看list被分成了几部分
rdd1.getNumPartitions() 
#Output:8

#glom().collect()查看分区状况
#小数据量情况下,可以直接将分布式的RDD通过转换函数collect()转换成一个数组,大数据量如上BT文件读入会爆掉内存……
rdd1.glom().collect()
#Output:[[], [('苹果', 8)], [], [('香蕉', 4)], [('葡萄', 6)], [], [('梨', 3)], [('火龙果', 9)]]
#如果是大数据量的rdd,可以用take(n)来选取n个数据查看
rdd1.take(3)
#Output:[('苹果', 8), ('香蕉', 4), ('葡萄', 6)]

#first()方法取读入的rdd数据第一个item
rdd1.first()
#Output:('苹果', 8)

通过以下命令查看CPU个数:

import psutil
print(u'cpu个数:',psutil.cpu_count())
#Output:cpu个数: 8

CPU个数为8,用list创建RDD时,就被分成了8个部分,可见分区数是按CPU个数决定的。

更多RDD的内容继续参考另一篇文章,写得挺不错的(嬉笑脸):pyspark的使用和操作(基础整理)

通过上面的内容应该对pyspark和RDD有所了解了吧,知道是怎么回事之后我们就继续开始后面的工作。

  • 二. pyspark的安装

1.准备spark和python的环境

以下内容都是在Linux环境下实现。

pyspark既然是python+spark,那么肯定需要spark和python了,我这里是在这之前已经搭建好了大数据集群,下面是我的集群:

pyspark学习_第1张图片

 

如果还没有spark环境的,网上有很多相关文章,这里就不做过多的说明。

也可以参考我写的《大数据平台环境部署手册》,我做了完整的总结:https://www.jianshu.com/p/bb09da06e045

Linux系统是自带了python的,不过是python2,现在基本上都用python3了,未来python2会停止维护。

安装Anaconda,Anaconda是个超级好用的工具,关于Anaconda的安装,网上有很多相关文章,这里也不做过多的说明。

2.安装pyspark

在Anaconda中使用pyspark,直接执行如下命令,就可以直接导入pyspark模块了,可以拿上面RDD的代码做测试。

conda install pyspark

接下来要开始我重要工作了。

  • 三. RDD转换sparkDataFrame

本来我的写到一半了,结果看到了有其他的博主写了pyspark学习系列的文章:

pyspark学习系列(一)创建RDD

pyspark学习系列(二)读取CSV文件 为RDD或者DataFrame进行数据处理

……这学习系列还有很多,基本上满足了我对于pyspark的所有学习需求

看到这些文章,我就又忍不住想偷懒了(@~@),不过我还是继续简单的记录一下自己学到的东西吧,跟紧大佬的步伐。

我们知道DataFrame是Python中Pandas库中的一种重要的数据结构,操作起数据来相当方便。spark也有DataFrame,概念差不多,RDD是最重要的数据载体。但RDD是无schema的数据结构,DataFrame是有schema的数据结构。

所以RDD想转换成DataFrame就是在RDD基础上加上schema,如果没有提前定义好schema的名称,转化过程中默认schema为:_1,_2,_3

RDD转换成DataFrame:

from pyspark.sql import SQLContext
sqlContest = SQLContext(sc)

data1 = spark.createDataFrame(rdd1)
data2 = sqlContest.createDataFrame(rdd1)

然后toPandas()就可以查看结果:

data1.toPandas()

pyspark学习_第2张图片

同样 dataframe也可以转换成rdd: rdd.map(lambda x: -----)

  • 四. 读取CSV文件 为RDD或者DataFrame进行数据处理

1. 本地csv文件读取:

最简单的方法:

import pandas as pd
file = pd.read_csv(file)
df = sqlContest.createDataFrame(file)

 2. hdfs上的csv文件读取:

1)采用先读为RDD再转换的形式

2)采用sqlContext.read.format()

有兴趣的可以参考下这个,不过我还没有实践过不知道能不能成功:python对hdfs/spark读写操作(hdfs/pyspark)

五. 其他

还可以利用SQL进行查询

#用createOrReplaceTempView方法创建临时表
df.createOrReplaceTempView("table")
#用SQL语句对这个临时表进行查询统计
spark.sql("select * from table").show()

 RDD还有很多跟Python的dataframe差不多的方法:

map() 对RDD的每一个item都执行同一个操作
flatMap() 对RDD中的item执行同一个操作以后得到一个list,然后以平铺的方式把这些list里所有的结果组成新的list
filter() 筛选出来满足条件的item
distinct() 对RDD中的item去重
sample() 从RDD中的item中采样一部分出来,有放回或者无放回
sortBy() 对RDD中的item进行排序

将RDD转化为dataframe之后,大多数就可以用dataframe的方法进行数据清洗了:去重,删除空值,统计等

这篇文章暂时就总结到这里,有问题的欢迎指正,也欢迎一起探讨一起学习哦。

 

“当你的才华还撑不起你的野心的时候,你就应该静下心来学习”

以后这句话将会出现在我的每一篇博文中,用于提醒我自己,静下来好好学习。

你可能感兴趣的:(spark#pyspark,Linux)