12.SparkSQL概述

SparkSQL是Spark用于高效处理结构化数据的模块,兼容Hive并提供DataFrame抽象。它通过统一的数据访问和易整合特性简化了SQL查询和Spark编程,允许无缝连接不同数据源,提升了开发效率和执行速度。

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 概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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|

+---+--------+
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值