與Apache Hive的兼容性#
Spark SQL 被設(shè)計(jì)成與Hive Metastore(元數(shù)據(jù)), SerDes 和UDFs兼容. 目前Spark SQL里的 Hive SerDes 和 UDFs 是基于Hive 1.2.1, 同時(shí) Spark SQL 可以連接不同版本的Hive Metastore (從 0.12.0 到 1.2.1. 可以查看Interacting with Different Versions of Hive Metastore ).
在Hive數(shù)據(jù)倉庫中部署Spark SQL#
Spark SQL Thrift JDBC 服務(wù)是設(shè)計(jì)成與現(xiàn)有的Hive設(shè)備是"開箱即用"的兼容。你不需要修改現(xiàn)有Hive的Metastore(元數(shù)據(jù))或更改數(shù)據(jù)的位置或表的分區(qū)等。
Spark SQL支持的Hive特性#
Spark SQL支持絕大多數(shù)的Hive特性,例如:
-
支持的Hive查詢語句,包括:
- SELECT
- GROUP BY
- ORDER BY
- CLUSTER BY
- SORT BY
-
所有Hive運(yùn)算符,包括
- 比較操作符(=, ?, ==, <>, <, >, >=, <=, etc)
- 算術(shù)運(yùn)算符(+, -, *, /, %, etc)
- 邏輯運(yùn)算符(AND, &&, OR, ||, etc)
- 復(fù)雜類型構(gòu)造器
- 數(shù)學(xué)函數(shù)(sign,ln,cos,etc)
- 字符串函數(shù)(instr,length,printf,etc)
用戶自定義函數(shù)(UDF)
用戶自定義聚合函數(shù)(UDAF)
用戶自定義序列化格式器(SerDes)
窗口函數(shù)
-
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
表分區(qū),包括動態(tài)分區(qū)插入
視圖
-
所有的Hive DDL函數(shù),包括:
- CREATE TABLE
- CREATE TABLE AS SELECT
- ALTER TABLE
-
大部分的Hive數(shù)據(jù)類型,包括:
- TINYINT
- SMALLINT
- INT
- BIGINT
- BOOLEAN
- FLOAT
- DOUBLE
- STRING
- BINARY
- TIMESTAMP
- DATE
- ARRAY<>
- MAP<>
- STRUCT<>
不支持的Hive功能#
下面是當(dāng)前不支持的Hive特性,其中大部分特性在實(shí)際的Hive使用中很少用到。
主要Hive特性
- Tables with buckets:bucket是在一個(gè)Hive表分區(qū)內(nèi)進(jìn)行hash分區(qū)。Spark SQL當(dāng)前不支持。
底層Hive特性
- UNION type
- Unique join
- Column statistics collecting:當(dāng)期Spark SQL不支持掃描收集列統(tǒng)計(jì)信息,只支持填充Hive Metastore的sizeInBytes列。
Hive 輸入/輸出格式
- File format for CLI(命令行文件格式化): 這個(gè)功能用于在CLI顯示返回結(jié)果,Spark SQL只支持TextOutputFormat
- Hadoop archive(特殊的檔案格式)
Hive優(yōu)化
部分Hive優(yōu)化還沒有添加到Spark中。沒有添加的Hive優(yōu)化(比如索引)對Spark SQL這種in-memory計(jì)算模型來說不是特別重要。下列Hive優(yōu)化將在后續(xù)Spark SQL版本中慢慢添加。
- 塊級別位圖索引和虛擬列(用于建立索引)
- 自動檢測joins和groupbys的reducer數(shù)量:當(dāng)前Spark SQL中需要使用“ SET spark.sql.shuffle.partitions=[num_tasks]; ”控制post-shuffle的并行度,不能自動檢測。
- 僅元數(shù)據(jù)查詢:對于可以通過僅使用元數(shù)據(jù)就能完成的查詢,當(dāng)前Spark SQL還是需要啟動任務(wù)來計(jì)算結(jié)果。
- 數(shù)據(jù)傾斜標(biāo)記:當(dāng)前Spark SQL不遵循Hive中的數(shù)據(jù)傾斜標(biāo)記
- jion中STREAMTABLE提示:當(dāng)前Spark SQL不遵循STREAMTABLE提示
- 為查詢結(jié)果合并多個(gè)小文件:如果查詢結(jié)果包含多個(gè)小文件,Hive能合并小文件為幾個(gè)大文件,避免HDFS Metadata溢出。當(dāng)前Spark SQL不支持這個(gè)功能。