与Apache Hive的兼容性#
Spark SQL 被设计成与Hive Metastore(元数据), SerDes 和UDFs兼容. 目前Spark SQL里的 Hive SerDes 和 UDFs 是基于Hive 1.2.1, 同时 Spark SQL 可以连接不同版本的Hive Metastore (从 0.12.0 到 1.2.1. 可以查看Interacting with Different Versions of Hive Metastore ).
在Hive数据仓库中部署Spark SQL#
Spark SQL Thrift JDBC 服务是设计成与现有的Hive设备是”开箱即用”的兼容。你不需要修改现有Hive的Metastore(元数据)或更改数据的位置或表的分区等。
Spark SQL支持的Hive特性#
Spark SQL支持绝大多数的Hive特性,例如:
支持的Hive查询语句,包括:
- SELECT
- GROUP BY
- ORDER BY
- CLUSTER BY
- SORT BY
所有Hive运算符,包括
- 比较操作符(=, ⇔, ==, <>, <, >, >=, <=, etc)
- 算术运算符(+, -, *, /, %, etc)
- 逻辑运算符(AND, &&, OR, ||, etc)
- 复杂类型构造器
- 数学函数(sign,ln,cos,etc)
- 字符串函数(instr,length,printf,etc)
用户自定义函数(UDF)
用户自定义聚合函数(UDAF)
用户自定义序列化格式器(SerDes)
窗口函数
Joins
- JOIN
- {LEFT|RIGHT|FULL} OUTER JOIN
- LEFT SEMI JOIN
- CROSS JOIN
Unions
- 子查询SELECT col FROM ( SELECT a + b AS col from t1) t2
Sampling
Explain
表分区,包括动态分区插入
视图
所有的Hive DDL函数,包括:
- CREATE TABLE
- CREATE TABLE AS SELECT
- ALTER TABLE
大部分的Hive数据类型,包括:
- TINYINT
- SMALLINT
- INT
- BIGINT
- BOOLEAN
- FLOAT
- DOUBLE
- STRING
- BINARY
- TIMESTAMP
- DATE
- ARRAY<>
- MAP<>
- STRUCT<>
不支持的Hive功能#
下面是当前不支持的Hive特性,其中大部分特性在实际的Hive使用中很少用到。
主要Hive特性
- Tables with buckets:bucket是在一个Hive表分区内进行hash分区。Spark SQL当前不支持。
底层Hive特性
- UNION type
- Unique join
- Column statistics collecting:当期Spark SQL不支持扫描收集列统计信息,只支持填充Hive Metastore的sizeInBytes列。
Hive 输入/输出格式
- File format for CLI(命令行文件格式化): 这个功能用于在CLI显示返回结果,Spark SQL只支持TextOutputFormat
- Hadoop archive(特殊的档案格式)
Hive优化
部分Hive优化还没有添加到Spark中。没有添加的Hive优化(比如索引)对Spark SQL这种in-memory计算模型来说不是特别重要。下列Hive优化将在后续Spark SQL版本中慢慢添加。
- 块级别位图索引和虚拟列(用于建立索引)
- 自动检测joins和groupbys的reducer数量:当前Spark SQL中需要使用“ SET spark.sql.shuffle.partitions=[num_tasks]; ”控制post-shuffle的并行度,不能自动检测。
- 仅元数据查询:对于可以通过仅使用元数据就能完成的查询,当前Spark SQL还是需要启动任务来计算结果。
- 数据倾斜标记:当前Spark SQL不遵循Hive中的数据倾斜标记
- jion中STREAMTABLE提示:当前Spark SQL不遵循STREAMTABLE提示
- 为查询结果合并多个小文件:如果查询结果包含多个小文件,Hive能合并小文件为几个大文件,避免HDFS Metadata溢出。当前Spark SQL不支持这个功能。