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实战指南)。