SparkSQL概述
1. SparkSQL概述
1.1 SparkSQL是什么
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7Xrat4M-1655396200675)(assets/1653210188965.png)]
-
Spark SQL是Spark用于结构化数据(structured data)处理的Spark模块。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EB5w3gRG-1655396200677)(assets/1653223225529.png)]
1.2 为什么有SparkSQL
1.2.1 概述
-
SparkCore:RDD -> 取代 MapReduce (更多使用Hive,编写SQL)
-
Shark(Hive on Spark) -> 取代Hive-
Hive底层默认是MapReduce,当SparkCore出现以后,能否将Hive底层变为RDD
-
Shark框架:将Hive框架源码拿过来,仅仅修改部分源码 -> SQL转换为RDD,并不是MR,此时Shark框架更多依赖Hive框架
- 问题一:Hive框架版本升级,有新功能,Shark 需要升级
- 问题二:Spark框架版本升级,有新功能,Shark需要升级
-
从2014年5月全球Spark Summit大会之上,终止Shark开发,自己实现依赖Hive框架代码的所有功能,称为Catalyst。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-liktjJ67-1655396200677)(assets/1653223510145.png)]
1.2.2 Hive and SparkSQL
-
SparkSQL的前身是Shark,给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具。
-
Hive是早期唯一运行在Hadoop上的SQL-on-Hadoop工具。但是MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,降低的运行效率,为了提高SQL-on-Hadoop的效率,大量的SQL-on-Hadoop工具开始产生,其中表现较为突出的是:
- Drill
- Impala
- Shark
-
其中Shark是伯克利实验室Spark生态环境的组件之一,是基于Hive所开发的工具,它修改了下图所示的右下角的内存管理、物理计划、执行三个模块,并使之能运行在Spark引擎上。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8STGvrX-1655396200678)(assets/1653210397496.png)]
-
Shark的出现,使得SQL-on-Hadoop的性能比Hive有了10-100倍的提高。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8QbZ98ie-1655396200679)(assets/1653210464108.png)]
1.2.3 SparkSQL历史
- 随着Spark的发展,对于野心勃勃的Spark团队来说,Shark对于Hive的太多依赖(如采用Hive的语法解析器、查询优化器等等),制约了Spark的One Stack Rule Them All的既定方针,制约了Spark各个组件的相互集成,所以提出了SparkSQL项目。SparkSQL抛弃原有Shark的代码,汲取了Shark的一些优点,如内存列存储(In-Memory Columnar Storage)、Hive兼容性等,重新开发了SparkSQL代码;由于摆脱了对Hive的依赖性,SparkSQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便,真可谓“退一步,海阔天空”。
- 数据兼容方面 SparkSQL不但兼容Hive,还可以从RDD、parquet文件、JSON文件中获取数据,未来版本甚至支持获取RDBMS数据以及cassandra等NOSQL数据;
- 性能优化方面 除了采取In-Memory Columnar Storage、byte-code generation等优化技术外、将会引进Cost Model对查询进行动态评估、获取最佳物理计划等等;
- 组件扩展方面 无论是SQL的语法解析器、分析器还是优化器都可以重新定义,进行扩展。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5HItjsu-1655396200680)(assets/1653211024055.png)]
1.2.4 SparkSQL和Hive on Spark
-
2014年6月1日Shark项目和SparkSQL项目的主持人Reynold Xin宣布:停止对Shark的开发,团队将所有资源放SparkSQL项目上,至此,Shark的发展画上了句话,但也因此发展出两个支线:SparkSQL和Hive on Spark。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWSlG6Nk-1655396200681)(assets/clip_image002.jpg)]
其中SparkSQL作为Spark生态的一员继续发展,而不再受限于Hive,只是兼容Hive;而Hive on Spark是一个Hive的发展计划,该计划将Spark作为Hive的底层引擎之一,也就是说,Hive将不再受限于一个引擎,可以采用Map-Reduce、Tez、Spark等引擎。
-
对于开发人员来讲,SparkSQL可以简化RDD的开发,提高开发效率,且执行效率非常快,所以实际工作中,基本上采用的就是SparkSQL。Spark SQL为了简化RDD的开发,提高开发效率,提供了2个编程抽象,类似Spark Core中的RDD
- DataFrame
- DataSet
2. SparkSQL特点
2.1 易整合
- 无缝的整合了 SQL 查询和 Spark 编程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byIKjDyR-1655396200682)(assets/1653211772545.png)]
2.2 统一的数据访问
-
使用相同的方式连接不同的数据源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dtjOQbJ-1655396200683)(assets/1653211805679.png)]
2.3 兼容Hive
-
在已有的仓库上直接运行 SQL 或者 HiveQL
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VxGBtVno-1655396200684)(assets/1653211846140.png)]
2.4 标准数据连接
-
通过 JDBC 或者 ODBC 来连接
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-buq0Ug6w-1655396200684)(assets/1653211878768.png)]
3. DataFrame
3.1 DataFrame是什么
- DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。
3.2 DataFrame和RDD的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ISOUocVs-1655396200685)(assets/1653212061639.png)]
-
上图直观地体现了DataFrame和RDD的区别。
-
DataFrame是基于RDD之上的分布式数据集,给予Schema信息。
- 左边:RDD -> 数据外在类型:Person(CaseClass),内部结构不知道
- 右边:DataFrame -> 数据内部结构,全部知道,包含字段名称和字段类型,但是不知道外部类型,Row类型(弱类型)
DataFrame = RDD[Row] + Schema
3.2 RDD与DataFrame性能
- Spark SQL性能上比RDD要高。因为Spark SQL了解数据内部结构,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观RDD,由于无从得知所存数据元素的具体内部结构,Spark Core只能在Stage层面进行简单、通用的流水线优化。
4. Spark SQL编程
4.1 创建DataFrame
- 在Spark SQL中SparkSession是创建DataFrame和执行SQL的入口,创建DataFrame有三种方式:
- 通过Spark的数据源进行创建;
- 从一个存在的RDD进行转换;
- 还可以从Hive Table进行查询返回。
4.2 从Spark数据源进行创建
(1)数据准备,在/opt/module/spark-local目录下创建一个user.json文件
{"age":20,"name":"qiaofeng"}
{"age":19,"name":"xuzhu"}
{"age":18,"name":"duanyu"}
(2)查看Spark支持创建文件的数据源格式,使用tab键查看
scala> spark.read.
csv format jdbc json load option options orc parquet schema table text textFile
(3)读取json文件创建DataFrame
scala> val df = spark.read.json("/opt/module/spark-local/user.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
(4)查看DataFrame算子
scala> df.
(5)展示结果
scala> df.show
+---+--------+
|age| name|
+---+--------+
| 20|qiaofeng|
| 19| xuzhu|
| 18| duanyu|
+---+--------+
4.3 SQL风格语法
4.3.1 概述
-
SQL语法风格是指我们查询数据的时候使用SQL语句来查询,这种风格的查询必须要有临时视图或者全局视图来辅助。视图:对特定表的数据的查询结果重复使用。View只能查询,不能修改和插入。
select * from t_user where age > 30 的查询结果可以存储在临时表v_user_age中,方便在后面重复使用。例如:select * from v_user_age
4.3.2 临时视图
(1)创建一个DataFrame
scala> val df = spark.read.json("/opt/module/spark-local/user.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
(2)对DataFrame创建一个临时视图
scala> df.createOrReplaceTempView("user")
(3)通过SQL语句实现查询全表
scala> val sqlDF = spark.sql("SELECT * FROM user")
sqlDF: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
(4)结果展示
scala> sqlDF.show
+---+--------+
|age| name|
+---+--------+
| 20|qiaofeng|
| 19| xuzhu|
| 18| duanyu|
+---+--------+
(5)求年龄的平均值
scala> val sqlDF = spark.sql("SELECT avg(age) from user")
sqlDF: org.apache.spark.sql.DataFrame = [avg(age): double]
(6)结果展示
scala> sqlDF.show
+--------+
|avg(age)|
+--------+
| 19.0|
+--------+
(7)创建一个新会话再执行,发现视图找不到
scala> spark.newSession().sql("SELECT avg(age) from user ").show()
org.apache.spark.sql.AnalysisException: Table or view not found: user; line 1 pos 14;
注意:普通临时视图是Session范围内的,如果想全局有效,可以创建全局临时视图。
4.3.3 全局视图
(1)对于DataFrame创建一个全局视图
scala> df.createGlobalTempView("user")
(2)通过SQL语句实现查询全表
scala> spark.sql("SELECT * FROM global_temp.user").show()
+---+--------+
|age| name|
+---+--------+
| 20|qiaofeng|
| 19| xuzhu|
| 18| duanyu|
+---+--------+
(3)新建session,通过SQL语句实现查询全表
scala> spark.newSession().sql("SELECT * FROM global_temp.user").show()
+---+--------+
|age| name|
+---+--------+
| 20|qiaofeng|
| 19| xuzhu|
| 18| duanyu|
+---+--------+
eng|
| 19| xuzhu|
| 18| duanyu|
±–±-------+
(3)新建session,通过SQL语句实现查询全表
~~~ scala
scala> spark.newSession().sql("SELECT * FROM global_temp.user").show()
+---+--------+
|age| name|
+---+--------+
| 20|qiaofeng|
| 19| xuzhu|
| 18| duanyu|
+---+--------+
SparkSQL是Spark用于高效处理结构化数据的模块,兼容Hive并提供DataFrame抽象。它通过统一的数据访问和易整合特性简化了SQL查询和Spark编程,允许无缝连接不同数据源,提升了开发效率和执行速度。
1490

被折叠的 条评论
为什么被折叠?



