Spark SQL简介
在Hadoop体系中,有Hive可以帮助我们将SQL转换为MR程序,Hive的基本架构如下:
Hive的工作流程为
因此,我们说Hive在Hadoop体系中扮演的是“编程”的角色,它本身并没有存储数据。
同样的,在我们使用Spark时,也很自然的会有这样的需求——通过编写SQL获取结果,避免重复的编写大量Spark程序代码。
在初期是,Shark就是扮演这样的角色,因此也被称为“Hive on Spark”。甚至Shark的整体架构和Hive都是类似的,区别是Hive将SQL转换为MR程序,Shark将SQL转换为Spark程序。
由于Shark是照搬的Hive,不方便针对Spark添加新的优化策略。并且Spark是线程级运行,而MapReduce是进程级别运行。因此Spark在兼容Hive时存在线程安全问题。因此Shark在实现Spark版的Hive时,专门做的实现。之后Shark团队就转而开发了Spark SQL。
在Spark SQL中,除了原来的“将SQL转换为抽象语法树”这一模块是照搬原来的模块,其他的模块全部是针对Spark新开发的。
Spark SQL的宗旨
一、在大数据时代,90%的数据都是半结构化或非架构化数据,无法利用传统的关系型数据库如Mysql去分析这些数据,Spark SQL就是为了解决这样的问题,它可以分析非结构化、半结构化和结构化数据。
二、关系型数据库仅支持综合性查询分析,如汇总、求和,但是今天,我们需要对数据执行更高级的分析,如使用机器学习算法进行决策分析、图像处理等,这是传统的关系型数据库不支持的。
在Spark Core中的数据抽象是RDD,而在Spark SQL中的数据抽象是DataFrame,是一种带有Schema的RDD,类似关系型表哥,可以进行相关查询。并且DataFrame是机器学习算法中通用的数据类型,可以非常方便的调用机器学习算法库。
DataFrame概述
DataFrame是Spark SQL的数据抽象,我们使用Spark SQL,就是对DataFrame进行各种操作,就好比我们在Spark Core中操作RDD。
RDD和DataFrame的区别:
DataFrame的创建
val sparkSession = SparkSession.builder().getOrCreate()
val df = sparkSession.read.json("file:///...")
df.show(