HiveQL視圖
視圖可以允許保存一個查詢並像對待表一樣對這個查詢進行操作。這是一個邏輯結構,因爲它不像一個表會存儲數據。換句話說,Hive目前暫不支持物化視圖。
當一個查詢引用一個視圖時,這個視圖所定義的查詢語句將和用戶的查詢語句組合在一起,然後供Hive制定查詢計劃。從邏輯上講,可以想象爲Hive先執行這個視圖,然後使用這個結果進行餘下後續的查詢。
當查詢變得長或者複雜的時候,通過使用視圖將這個查詢語句分割成多個小的、更可控的片段可以降低這種複雜度。
創建語句
create view view_name as select xxx...
使用視圖來限制基於條件過濾的數據
數據庫允許將視圖作爲一個安全機制,也就是不給用戶直接訪問具有敏感數據的原始表,而是提供一個帶有where子句限制了的視圖。
**但是Hive目前不支持這個功能。因爲用戶必須具有能夠訪問整個底層原始表的權限,才能執行視圖的語句。**然而通過創建視圖來限制數據訪問可以用來保護信息不被隨意查詢。
動態分區中的視圖和map類型
![[外鏈圖片轉存失敗(img-bClOUc9L-1568856654168)(D:\學習筆記\Hive編程指南截圖\保存圖片\Hive中的表\11動態分區中的視圖.jpg)](https://img-blog.csdnimg.cn/20190919093128526.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h4eWR6eXI=,size_16,color_FFFFFF,t_70)
視圖其他相關
-
Hive會先解析視圖,然後使用解析結果再來解析整個查詢語句。然而,作爲Hive查詢優化器的一部分,查詢語句和視圖語句可能會合併成一個單一的實際查詢語句。
-
定義一個視圖實際上並不會 “具體化“ 操作任何實際數據,所以視圖實際上是對其所使用到的表和列的一個查詢語句固化過程。因此,如果視圖所涉及的表或者列不再存在時,會導致視圖查詢失敗。
-
一個視圖的名稱要和這個視圖所在的數據庫下的其他所有表和視圖的名稱不同。
-
用戶還可以爲所有的新列或部分新列增加一個COMMNET子句,進行寫註釋。這些註釋並非“繼承”原始表中的定義。同樣地,如果ASSELECT子句中包含沒有命名別名的表達式的話,例如size(cols)(計算cols中元素的個數),那麼Hive將會使用_CN作爲新的列名,其中N表示從0開始的一個整數。如果ASSELECT語句不合法的話,那麼創建視圖過程將失敗。
-
在ASSELECT子句之前,用戶可以通過定義
TBLPROPERTIES
來定義表屬性信息,這點和表相同。
CREATE TABLE...LIKE...
結構同樣適用於複製視圖,只需要在LIKE表達式裏面寫視圖名就可以了:
CREATE TABLE shipments2 LIKE shipments;
用戶也可以像以前一樣選擇性使用EXTERNAL
關鍵字和LOCATION..…
子句。 -
警告對於Hivev0.8.0版本和這個版本前的其他版本來說,這個語句的行爲是不同的。對於v0.8.0版本,這個命令會創建一個新的表,而不是一個新的視圖,同時使用默認的SerDe方式和文件格式。而對於之前的早期版本來說,會創建一個新的視圖。
-
刪除視圖的方式和刪除表的方式類似:
DROP VIEW IE EXISTS shipments;
-
通過
SHOW TABLES
語句(沒有SHOW VIEWS這樣的語句)同樣可以查看到視圖,但是不能使用DROP TABLE
語句來刪除視圖。 -
和表一樣,
DESCRIBE
和DESCRIBE EXTENDED
語句可以顯示視圖的元數據信息。
如果使用後面那個命令,輸出信息中的“Detailed Table Information”
部分會有一個tableType
字段,字段值顯示的是“VIRTUAL_VIEW”
。 -
視圖不能夠作爲 INSERT 語句或 LOAD 命令的目標表。
-
最後要說明的是,視圖是隻讀的。對於視圖只允許改變元數據中TBLPROPERTIES屬性信息:
ALTER VIEW shipments SET TBLPROPERTIES('created at'='some_timestamp');