初识PySpark(1)

1、spark简介

1.0 spark 是什么?

(1)一个高效的分布式查询和处理引擎。具有MapReduce的灵活性和可扩展性,但速度比hadoop快。

(2)用户可以通过java 、R、python、scala和SQL访问spark API完成数据的读取、传换和聚合操作。

1.1 spark执行过程

(1)spark应用都会分离主节点中的单个驱动进程,然后将执行进程分配给多个工作节点。

1.2弹性分布式数据集(简称RDD)

(1)RDD是不可变的java虚拟机(JVM)对象的分布式集合。python数据就是存储在这些JVM对象中的。RDD以并行的方式应用和数据记录。          

(2)RDD有两组并行操作,转换(返回新的RDD指针)和 动作(在运行计算后向驱动程序返回值)

1.3 DataFrame 简介

(1)与RDD一样是集群的节点中的不可变的数据集合。与RDD不同的是DataFrame与python中的pandas类似以命名列的方式组织数据。为什么引入DataFrame?python中使用DataFrame性能要比RDD要快。

1.4 Catalyst 优化器简介

(1)spark sql是提供了SQL查询和DataFrame API 是 spark核心内容之一,而Catalyst 优化器是spark核心内容。 (我的理解是类似其他关系型数据库的优化器,对Spark SQL进行编译并优化了逻辑计划,并且确保生成最高效的物理计划的成本优化器)

1.5 Dataset 简介

(1)提供一个API方便用户对象转换,同时提供强大性能和优点的spark Sql执行引擎。仅在Scala或java使用。 Dataset的作用是提供类型安全的编程接口(运行前检查)。Python不实现Dataset API的部分原因是python不是一种安全类型语言。

1.6 Spark API的历史演变过程

1.7 PySpark安装:

(1)安装 jdk (2) 安装hadoop (3)安装spark (4)安装Py4j

参考  https://blog.csdn.net/zbzckaiA/article/details/81455007

 

2.初识 RDD

2.0 SparkSession

(1) 介绍RDD可以先了解一下SparkSession,我们知道SparkConf、SparkContext、SQLContext和HiveContext分别执行配置、Spark环境、SQL环境和Hive环境的各种Spark查询。而SparkSession就是这些集合。

2.1 RDD是什么?

(1)Spark核心,一组不可变的JVM对象分布集,基于某种关键字,划分成块分发到各个执行节点。RDD记录每个块的所有转换,并在发生错误的时候提供回退。

(2)RDD优势是并行执行的提高效率,但数据转换是惰性的,仅在调用数据集上操作时才执行。

2.2 常用的RDD转换

 (1).map(..) 转换

 

(2).filter() 转换

 

(3).flatMap(.. ) 转换

 

(4).distinct() 转换

 

(5).sample() 转换

 

(6).leftOuterJoin() 转换

 

(7).repartition() 转换( 注意: 改变数据集分区的数量,对性能方面调整影响比较大。)

 

2.3 常有的RDD动作

(1).take () 返回单个数据分区的前n行

 

(2).reduce (f) 通过指定的方法对结构进行处理,注意分区的影响

⚠️注意:为什么要注意分区的影响?举个例子

使用除法作为函数,传递给reduce对列表进行操作

但数据为一个分区时得到结果是10

如果指定为3个分区,结果确实0.004,这个结果并不符合我们预期。

所以建议传递的函数需要是关联的,结果不变。该函数还需要是交换的,即操作符顺序改变家,结果不变。

 

(3).count()  统计RDD里的元素数量

(4).foreach()  对RDD里每个元素迭代的方式使用相应的元素

 

(5).saveAsTextFile(...)  将RDD保存为文本

 

3、初识Dataframe

3.0 DataFrame简介

与RDD都是一种不可变的分布式数据集

与RDD的区别:

(1)DataFrame维护表结构,并且对许多常见的SQL函数和关系型操作符提供了原生支持。

(2)java/Scala 操作RDD的底层是跑在JVM上的 Python 操作RDD的底层不跑在JVM上,它有Python Execution 因此使用RDD编程带来一个很大的问题: 由于使用不同语言操作RDD,底层所运行的环境不同,效率不一样 但是有了DataFrame是不一样的 DF不是直接到运行环境的,中间还有一层是logicplan,统统先转换成逻辑执行计划之后,再去进行运行的;所以现在DF不管采用什么语言,它的执行效率都是一样的

创建一个DataFrame

>>> swimmersJson = spark.read.json(stringJson)

创建一个临时表

>>> swimmersJson.createOrReplaceTempView("swimmersJson")

通过DataFrame API查询

>>> swimmersJson.show()

也可以通过SQL查询

>>> spark.sql("select * from swimmersJson").show(2)

3.1 从RDD变换到DataFrame有两种模式

(1)反射推断模式:在建立DataFrame过程中,数据类型是通过采样数据来推断的。(优点:代码整洁) 

如上例子,数据类型通过采样数据来判断。通过printSchema()可看到Id是String类型,但实际是哥Long类型

>>> swimmersJson.printSchema()

(2)以编程方式指定模式:通过在Spark SQL中的数据类型(pyspark.sql.types),以编程的方式指定模式。

如下例子

创建一个RDD:

>>> stringCSV = sc.parallelize([(123,'Katie', 19, 'brown'),(234,'Michael',22,'green'),(345,'Simone', 23,'blue')])

然后指定模式 :

>>> schema = StructType([

StructField("id", LongType(), True),

StructField("name", StringType(), True),

StructField("age", LongType(), True),

StructField("eyeColor", StringType(), True)

])

然后转化为dataFrame

>>> df2 = spark.createDataFrame(stringCSV,schema)

>>> df2.createOrReplaceTempView("df2")

再查看指定后的模式:

>>> df2.printSchema() 

3.2 常用的DataFram API介绍

 (1).count() 统计行数: 

>>> swimmersJson.count()

3

(2).filter() 筛选子句:

>>> swimmersJson.select("id","age").filter("age = 22").show()

也可以写成以下这种形式

>>> swimmersJson.select("id","age").filter(swimmersJson.age == 22).show()

 

(3)like语法使用:

>>> swimmersJson.select("id","age").filter("eyeColor like 'b%'").show()

 (4).join(other, on=None, how=None)操作

注意:on是关联条件, how是关联方式,default inner. Must be one of: inner, cross, outer, full, full_outer, left, left_outer, right, right_outer, left_semi, and left_anti.

如DataFrame df1 和 df2

>>> df2 = spark.createDataFrame([ ('a', 1), ('b', 3)], ['C1', 'C2'])

>>> df1 = spark.createDataFrame([('a', 1), ('b', 3), ('c', 4)], ['C1', 'C2'])

实现inner join

>>> df1.join(df2,df1.C1 == df2.C1, 'inner').show()

实现left outer join

>>> df1.join(df2,df1.C1 == df2.C1, 'left_outer').show()

3.3 使用SQL操作DataFrame

 (1)SQL统计行数 :

>>> spark.sql("select count(1) from swimmersJson").show()

(2)like过滤操作:

>>> spark.sql("select name ,eyeColor from swimmersJson where eyeColor like 'b%'").show()

更多DataFrame的例子可看 http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame

小结:RDD时spark的核心概念,DataFrame避免了python子进程/JVM间通信的开销,丰富的API和SQL支持,更便于python开发用户的使用。 最后推荐一本书(PySpark实战指南)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值