Spark SQL 在设计时就考虑到了和 Hive metastore,SerDes 以及 UDF 之间的兼容性。目前 Hive SerDes 和 UDF 都是基于Hive 1.2.1版本,并且Spark SQL 可以连接到不同版本的Hive metastore(从 0.12.0 到 1.2.1,可以参考[与不同版本的Hive Metastore交互])
在现有的 Hive 仓库中部署
Spark SQL Thrift JDBC server 采用了开箱即用的设计以兼容已有的 Hive 安装版本。你不需要修改现有的 Hive Metastore , 或者改变数据的位置和表的分区。
支持 Hive 的特性
Spark SQL 支持绝大部分的 Hive 功能,如 :
- Hive 查询语句, 包括 :
- SELECT
- GROUP BY
- ORDER BY
- CLUSTER BY
- SORT BY
- 所有的Hive运算符, 包括 :
- 关系运算符 (=, ⇔, ==, <>, <, >, >=, <=, etc)
- 算术运算符 (+, -, *, /, %, etc)
- 逻辑运算符 (AND, &&, OR, ||, etc)
- 复杂类型构造器 - 数学函数 (sign, ln, cos等)
- String 函数 (instr, length, printf等)
- 用户自定义函数(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
- 采样
- 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 核心功能
bucket : bucket 是 Hive 表分区内的一个哈希分区,Spark SQL目前还不支持 bucket。
Hive 高级功能
- UNION 类型
- Unique join
- 列统计数据收集 : Spark SQL目前不依赖扫描来收集列统计数据并且仅支持填充 Hive metastore 的 sizeInBytes 字段。
Hive 输入输出格式
- CLI文件格式 : 对于回显到CLI中的结果,Spark SQL仅支持TextOutputFormat。
- Hadoop archive
Hive 优化
有少数 Hive 优化还没有包含在 Spark 中。其中一些(比如索引)由于 Spark SQL 的这种内存计算模型而显得不那么重要。另外一些在 Spark SQL 未来的版本中会持续跟踪。
- 块级别位图索引和虚拟列(用来建索引)
- 自动为 join 和 groupBy 计算 reducer 个数 : 目前在 Spark SQL 中,你需要使用 ”SET spark.sql.shuffle.partitions=[num_tasks];”
- 来控制后置混洗的并行程度。
- 仅查询元数据 : 对于只需要使用元数据的查询请求,Spark SQL仍需要启动任务来计算结果。
- 数据倾斜标志 : Spark SQL 不遵循 Hive 中的数据倾斜标志
- STREAMTABLE join操作提示 : Spark SQL 不遵循 STREAMTABLE 提示。
- 对于查询结果合并多个小文件 : 如果返回的结果有很多小文件,Hive 有个选项设置,来合并小文件,以避免超过HDFS的文件数额度限制。Spark SQL 不支持这个。