簡介
Hive 中的視圖和 RDBMS 中視圖的概念一致,都是一組數據的邏輯表示,本質上就是一條 SELECT 語句的結果集。視圖是純粹的邏輯對象,沒有關聯的存儲 (Hive 3.0.0 引入的物化視圖除外),當查詢引用視圖時,Hive 可以將視圖的定義與查詢結合起來,例如將查詢中的過濾器推送到視圖中。
視圖
普通視圖:是一個虛擬表,其本身不存儲數據,數據是由查詢語句定義的。簡單來說視圖只是的定義了 數據結構的元數據。
物化視圖:是一個特殊物理表,視圖本身保存數據,其數據來源是根據原始表或者是遠程表查詢而來,並且會定時更新數據。Hive目前僅3.0及以上版本支持。
hive 視圖特點
在 Hive 中可以使用 CREATE VIEW
創建視圖,如果已存在具有相同名稱的表或視圖,則會拋出異常,建議使用 IF NOT EXISTS
預做判斷。在使用視圖時候需要注意以下事項: :
- 只有邏輯視圖,沒有物化視圖;
- 視圖是隻讀的,不能 Load/Insert/Update/Delete 數據;
- hive的視圖僅僅相當於一個sql的快捷方式,爲了提升hql語句的可讀性
- 視圖在創建時候,只是保存了一份元數據,當查詢視圖的時候,纔開始執行視圖對應的那些子查詢
- hive的視圖保存在元數據庫中
元數據庫保存的類型爲 VIRTUAL_VIEW
元數據庫保存當前視圖代表的sql語句 - 創建視圖時,如果 SELECT 語句中包含其他表達式,例如 x + y,則列名稱將以_C0,_C1 等形式生成
- 創建視圖時,如果未提供列名,則將從 SELECT 語句中自動派生列名
- 刪除基表並不會刪除視圖,需要手動刪除視圖
- 在創建視圖時候視圖就已經固定,對基表的後續更改(如添加列)將不會反映在視圖
- 視圖可能包含 ORDER BY 和 LIMIT 子句。如果引用視圖的查詢語句也包含這類子句,其執行優先級低於視圖對應字句。例如,視圖 custom_view 指定 LIMIT 5,查詢語句爲 select * from custom_view LIMIT 10,此時結果最多返回 5 行。
創建視圖
create view view_name as select * from carss; create view carss_view as select * from carss limit 500;
查看視圖
show tables; // 可以查看錶,也可以查看視圖 desc view_name // 查看某個具體視圖的信息 desc carss_view
刪除視圖
drop view view_name drop view if exists carss_view
刪除視圖時,如果被刪除的視圖被其他視圖所引用,這時候程序不會發出警告,但是引用該視圖其他視圖已經失效,需要進行重建或者刪除。
使用視圖
create view sogou_view as select * from sogou_table where rank > 3 ; select count(distinct uid) from sogou_view;
修改視圖
ALTER VIEW [db_name.]view_name AS select_statement;
被更改的視圖必須存在,且視圖不能具有分區,如果視圖具有分區,則修改失敗。