本节主要介绍什么是Spark SQL,以及Spark SQL的特点。
Spark自诞生之后,越来越受到人们的喜爱,使用Spark的人也越来越多。突然有一天,一部分技术专家产生了一个大胆的想法:Hadoop上面有Hive,Hive能把SQL转换成MapReduce作业,这非常地方便,但Spark这么好用的系统却没有配备类似Hive这样的工具,要不我们也创造一个这样的工具吧!于是Shark被提了出来,它将SQL语句转换成RDD(Resilient Distributed Dataset,弹性分布式数据集)来执行。这就仿照了Hadoop生态圈,做出了一个Spark版本的“Hive”。有了Shark工具之后,人们也能愉快地使用SQL对数据进行查询分析了,这大大提高了程序的编写效率。Shark的架构示意图如图1-1所示。
图1-1 Shark框架示意图
随着越来越多的人使用Shark以及其版本的不断更新,人们发现Shark具有一定的局限性。细心的读者会发现,在图1-1所示的Shark框架中,使用了HiveQL Parser这一模块。这样一来Shark对Hive有了依赖,导致在添加一些新的功能或者修改一些东西时特别不方便。这样Shark的发展就受到了严重的限制。
由于Shark具有这样的一些弊端,因此在2014年左右人们决定终止Shark这个项目,并将精力转移到Spark SQL的研发当中去。之后一个新的SQL引擎——Spark SQL就诞生了。
Spark SQL是用于结构化数据(Structured Data)处理的Spark模块。与基本的Spark RDD API不同,Spark SQL的抽象数据类型为Spark提供了关于数据结构和正在执行的计算的更多信息。在内部,Spark SQL使用这些额外的信息去做一些优化。
有多种方式可以与Spark SQL进行交互,比如SQL和Dataset API。当进行计算时,这些接口使用相同的执行引擎,不依赖正在使用哪种API或者语言。这种统一也就意味着开发者可以很容易地在不同的API之间进行切换,这些API提供了最自然的方式来表达给定的转换。
Hive是将Hive SQL转换成MapReduce,然后提交到集群上执行,虽然大大简化了编写MapReduce程序的复杂性,但MapReduce这种计算模型的执行效率比较低。而Spark SQL是将SQL语句转换成RDD,然后提交到集群上执行,执行效率非常高。
Spark SQL提供了以下两个编程抽象,类似Spark Core中的RDD。
●DataFrame。
●DataSet。
Spark SQL具有以下特点:
Spark SQL无缝地整合了SQL查询和Spark编程,如图1-2所示。
图1-2 Spark SQL的特点——Integrated
Spark SQL使用相同的方式连接不同的数据源,如图1-3所示。
图1-3 Spark SQL的特点——Uniform Data Access
Spark SQL在已有的仓库上直接运行SQL或者HiveQL,如图1-4所示。
图1-4 Spark SQL的特点——Hive Integration
Spark SQL通过JDBC或者ODBC来连接,如图1-5所示。
图1-5 Spark SQL的特点——Standard Connectivity