一、Spark SQL概念
它主要用于结构化数据处理和对Spark数据执行类SQL的查询。通过Spark SQL,可以针对不同格式的数据执行ETL操作(如JSON,Parquet,数据库)然后完成特定的查询操作。一般来说,Spark每支持一种新的应用开发,都会引入一个新的Context及相应的RDD,对于SQL这一特性来说,引入的就是SQLContext和SchemaRDD。注意:在Spark1.3之后,SchemaRDD已经更名为DataFrame,但它本质就类似一个RDD,因为可以将DataFrame无缝的转换成一个RDD。
二、Spark SQL的特点
提供标准化的SQL支持和子查询支持
支持多种数据源: Hive、 RDD、Parquet、 JSON、 JDBC等。
多种性能优化技术: in memory columnar storage、byte code generation、cost model动态评估等。
组件扩展性:对于SQL的语法解析器、分析器以及优化器,用户都可以自已重新开发,并且动态扩展。
1、内存列存储(in-memory columnar storage)
内存列存储意味着,Spark SQL的数据,不是使用Java对象的方式来进行存储,而是使用面向列的内存存储的方式来进行存储。也就是说,每一列,作为一个数据存储的单位。从而大大优化了内存使用的效率。采用了内存列存储之后,减少了对内存的消耗,也就避免了gc大量数据的性能开销。
2、字节码生成技术(byte code generation)
Spartk SQL在其catalyst模块的expressions中增加了codegen模块,对于SQL语句中的计算表达式,比如select num +num from t这种的sql,就可以使用动态字节码生成技术来优化其性能。
3、Scala代码编写的优化
对于Scala代码编写中,可能会造成较大性能开销的地方,自己重写,使用更加复杂的方式,来获取更好的性能。比如Option样例类、for循 环、map/filter/foreach等高 阶函数,以及不可变对象,都改成了用null、while循 环等来实现,并且重用可变的对象。
三、Spark SQL 与 Hive 的区别
前面介绍了spark sql的基本概念,下面介绍一下Spark SQL 与 Hive 的区别。
什么是Spark SQL
Spark SQL是Spark中专门用来处理结构化数据(每一行数据都遵循Schema信息建表时表的字段及其类型)的一个模块
提供了 DataFrame/Dataset 的对分布式数据处理的基本抽象
其实之上是一个分布式的 SQL 引擎
什么是 Hive
数据仓库,能使用 SQL 读取、写入和管理存在于分布式存储架构上的大数据集
结构可以映射到已经存储的数据上
用户连接 Hive 可以使用命令行工具和 JDBC 驱动
两者的区别
都支持ThriftServer服务,为JDBC提供解决方案,区别如下:
Spark SQL
是Spark的一个库文件
Spark SQL 元数据可有可无
Spark SQL 中 schema 是自动推断的
支持标准 SQL 语句,也支持 HQL 语句等
从开发角度来讲,即支持SQL方式开发,也支持HQL开发,还支持函数式编程(DSL)实现SQL语句
Hive
是一个框架
Hive中必须有元数据,一般由 MySql 管理,必须开启 metastore 服务
Hive 中在建表时必须明确使用 DDL 声明 schema
只支持 HQL 语句
Hive:处理海量数据,比如一个月、一个季度、一年的数据量,依然可以处理,虽然很慢;
Spark SQL:这种情况下 Spark SQL 不支持,无法处理;