Hive 中的視圖和 RDBMS 中視圖的概念一致,都是一組數據的邏輯表示,本質上就是一條 SELECT 語句的結果集。視圖是純粹的邏輯對象,沒有關聯的存儲 (Hive 3.0.0 引入的物化視圖除外),當查詢引用視圖時,Hive 能夠將視圖的定義與查詢結合起來,例如將查詢中的過濾器推送到視圖中。git
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name -- 視圖名稱 [(column_name [COMMENT column_comment], ...) ] --列名 [COMMENT view_comment] --視圖註釋 [TBLPROPERTIES (property_name = property_value, ...)] --額外信息 AS SELECT ...;
在 Hive 中可使用 CREATE VIEW
建立視圖,若是已存在具備相同名稱的表或視圖,則會拋出異常,建議使用 IF NOT EXISTS
預作判斷。在使用視圖時候須要注意如下事項:github
視圖是隻讀的,不能用做 LOAD / INSERT / ALTER 的目標;sql
在建立視圖時候視圖就已經固定,對基表的後續更改(如添加列)將不會反映在視圖;apache
刪除基表並不會刪除視圖,須要手動刪除視圖;性能優化
視圖可能包含 ORDER BY 和 LIMIT 子句。若是引用視圖的查詢語句也包含這類子句,其執行優先級低於視圖對應字句。例如,視圖 custom_view
指定 LIMIT 5,查詢語句爲 select * from custom_view LIMIT 10
,此時結果最多返回 5 行。oop
建立視圖時,若是未提供列名,則將從 SELECT 語句中自動派生列名;性能
建立視圖時,若是 SELECT 語句中包含其餘表達式,例如 x + y,則列名稱將以_C0,_C1 等形式生成;大數據
CREATE VIEW IF NOT EXISTS custom_view AS SELECT empno, empno+deptno , 1+2 FROM emp;
-- 查看全部視圖: 沒有單獨查看視圖列表的語句,只能使用 show tables show tables; -- 查看某個視圖 desc view_name; -- 查看某個視圖詳細信息 desc formatted view_name;
DROP VIEW [IF EXISTS] [db_name.]view_name;
刪除視圖時,若是被刪除的視圖被其餘視圖所引用,這時候程序不會發出警告,可是引用該視圖其餘視圖已經失效,須要進行重建或者刪除。優化
ALTER VIEW [db_name.]view_name AS select_statement;
被更改的視圖必須存在,且視圖不能具備分區,若是視圖具備分區,則修改失敗。ui
語法:
ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties; table_properties: : (property_name = property_value, property_name = property_value, ...)
示例:
ALTER VIEW custom_view SET TBLPROPERTIES ('create'='heibaiying','date'='2019-05-05');
Hive 在 0.7.0 引入了索引的功能,索引的設計目標是提升表某些列的查詢速度。若是沒有索引,帶有謂詞的查詢(如'WHERE table1.column = 10')會加載整個表或分區並處理全部行。可是若是 column 存在索引,則只須要加載和處理文件的一部分。
在指定列上創建索引,會產生一張索引表(表結構以下),裏面的字段包括:索引列的值、該值對應的 HDFS 文件路徑、該值在文件中的偏移量。在查詢涉及到索引字段時,首先到索引表查找索引列值對應的 HDFS 文件路徑及偏移量,這樣就避免了全表掃描。
+--------------+----------------+----------+--+ | col_name | data_type | comment | +--------------+----------------+----------+--+ | empno | int | 創建索引的列 | | _bucketname | string | HDFS 文件路徑 | | _offsets | array<bigint> | 偏移量 | +--------------+----------------+----------+--+
CREATE INDEX index_name --索引名稱 ON TABLE base_table_name (col_name, ...) --創建索引的列 AS index_type --索引類型 [WITH DEFERRED REBUILD] --重建索引 [IDXPROPERTIES (property_name=property_value, ...)] --索引額外屬性 [IN TABLE index_table_name] --索引表的名字 [ [ ROW FORMAT ...] STORED AS ... | STORED BY ... ] --索引錶行分隔符 、 存儲格式 [LOCATION hdfs_path] --索引表存儲位置 [TBLPROPERTIES (...)] --索引表表屬性 [COMMENT "index comment"]; --索引註釋
--顯示錶上全部列的索引 SHOW FORMATTED INDEX ON table_name;
刪除索引會刪除對應的索引表。
DROP INDEX [IF EXISTS] index_name ON table_name;
若是存在索引的表被刪除了,其對應的索引和索引表都會被刪除。若是被索引表的某個分區被刪除了,那麼分區對應的分區索引也會被刪除。
ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;
重建索引。若是指定了 PARTITION,則僅重建該分區的索引。
在 emp 表上針對 empno
字段建立名爲 emp_index
,索引數據存儲在 emp_index_table
索引表中
create index emp_index on table emp(empno) as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild in table emp_index_table ;
此時索引表中是沒有數據的,須要重建索引纔會有索引的數據。
alter index emp_index on emp rebuild;
Hive 會啓動 MapReduce 做業去創建索引,創建好後查看索引表數據以下。三個表字段分別表明:索引列的值、該值對應的 HDFS 文件路徑、該值在文件中的偏移量。
默認狀況下,雖然創建了索引,可是 Hive 在查詢時候是不會自動去使用索引的,須要開啓相關配置。開啓配置後,涉及到索引列的查詢就會使用索引功能去優化查詢。
SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat; SET hive.optimize.index.filter=true; SET hive.optimize.index.filter.compact.minsize=0;
SHOW INDEX ON emp;
索引表最主要的一個缺陷在於:索引表沒法自動 rebuild,這也就意味着若是表中有數據新增或刪除,則必須手動 rebuild,從新執行 MapReduce 做業,生成索引表數據。
同時按照官方文檔 的說明,Hive 會從 3.0 開始移除索引功能,主要基於如下兩個緣由:
ORC 內置的索引功能能夠參閱這篇文章:Hive 性能優化之 ORC 索引–Row Group Index vs Bloom Filter Index
更多大數據系列文章能夠參見 GitHub 開源項目: 大數據入門指南