Hive體系結構(三)元數據庫與基本操作

Hive體系結構(一)架構與基本組成
Hive體系結構(二)Hive的執行原理、與關係型數據庫的比較
Hive體系結構(三)元數據庫與基本操作
Hive體系結構(四)注意事項與擴展特性

1. Hive元數據庫

Hive將元數據存儲在RDBMS 中,一般常用的有MYSQL和DERBY。
hive元數據對應的表約有20個,其中和表結構信息有關的有9張,其餘的10多張或爲空,或只有簡單的幾條記錄,以下是部分主要表的簡要說明。

表名 說明 關聯鍵
TBLS 所有hive表的基本信息 TBL_ID,SD_ID
TABLE_PARAM 表級屬性,如是否外部表,表註釋等 TBL_ID
COLUMNS Hive表字段信息(字段註釋,字段名,字段類型,字段序號) SD_ID
SDS 所有hive表、表分區所對應的hdfs數據目錄和數據格式 SD_ID,SERDE_ID
SERDE_PARAM 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等 SERDE_ID
PARTITIONS Hive表分區信息 PART_ID,SD_ID,TBL_ID
PARTITION_KEYS Hive分區表分區鍵 TBL_ID
PARTITION_KEY_VALS Hive表分區名(鍵值) PART_ID

從上面表的內容來看,hive整個創建表的過程已經比較清楚了。
1. 解析用戶提交hive語句,對其進行解析,分解爲表、字段、分區等hive對象
2. 根據解析到的信息構建對應的表、字段、分區等對象,從 SEQUENCE_TABLE中獲取構建對象的最新ID,與構建對象信息(名稱,類型等)一同通過DAO方法寫入到元數據表中去,成功後將SEQUENCE_TABLE中對應的最新ID+5。

實際上我們常見的RDBMS都是通過這種方法進行組織的,典型的如postgresql,其系統表中和hive元數據一樣裸露了這些id信息(oid,cid等),而Oracle等商業化的系統則隱藏了這些具體的ID。通過這些元數據我們可以很容易的讀到數據諸如創建一個表的數據字典信息,比如導出建表語名等。

2. Hive基本操作

Create Table語句

一些注意項:
1. CREATE TABLE創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用IF NOT EXIST選項來忽略這個異常。
2. EXTERNAL 關鍵字可以讓用戶創建一個外部表,在建表的同時指定一個指向實際數據的路徑( LOCATION ),Hive 創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。
3. LIKE允許用戶複製現有的表結構,但是不復制數據。
4. 用戶在建表的時候可以自定義SerDe或者使用自帶的 SerDe ( Serialize/Deserilize 的簡稱,目的是用於序列化和反序列化 )。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會使用自帶的SerDe。在建表的時候,用戶還需要爲表指定列,用戶在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數據。
5. 如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據需要壓縮,使用STORED AS SEQUENCE。
6. 有分區的表可以在創建的時候使用 PARTITIONED B Y語句。一個表可以擁有一個或者多個分區,每一個分區單獨存在一個目錄下。而且,表和分區都可以對某個列進行CLUSTERED BY操作,將若干個列放入一個桶(bucket)中。也可以利用SORT BY對數據進行排序。這樣可以爲特定應用提高性能。
7. 表名和列名不區分大小寫,SerDe和屬性名區分大小寫。表和列的註釋是字符串。

Alter Table語句

主要功能包括Add Partitions, Drop Partitions, Rename Table, Change Column, Add/Replace Columns。

Create View語句

創建視圖。格式CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], …) ]

Show語句

Show tables; Show partitions; describe查看錶結構。

Load語句

HIVE裝載數據時沒有做任何轉換,加載到表中的數據只是進入相應的配置單元表的位置。Load操作只是單純的複製/移動操作,將數
據文件移動到Hive表對應的位置。

Insert語句

插入數據。Hive不支持一條一條的用 insert 語句進行插入操作,這個應該是與hive的storage layer是有關係的,因爲它的存儲層是HDFS,插入一個數據要全表掃描,還不如用整個表的替換來的快些。Hive也不支持update的操作。數據是以load的方式,加載到建立好的表中。數據一旦導入,則不可修改。要麼drop掉整個表,要麼建立新的表,導入新的數據。

Drop語句

刪除一個內部表的同時會同時刪除表的元數據和數據。刪除一個外部表,只刪除元數據而保留數據。

Limit子句

可以限制查詢的記錄數。查詢的結果是隨機選擇的。下面的查詢語句從 t1 表中隨機查詢5條記錄,SELECT * FROM t1 LIMIT 5

Top K查詢

下面的查詢語句查詢銷售記錄最大的 5 個銷售代表。

SET mapred.reduce.tasks = 1
SELECT * FROM sales SORT BY amount DESC LIMIT 5

正則表達式使用

SELECT語句可以使用正則表達式做列選擇,下面的語句查詢除了ds和h 之外的所有列:

SELECT `(ds|hr)?+.+` FROM sales

SELECT語句

查詢數據

Group by, Order by, Sort by子句

聚合可進一步分爲多個表,甚至發送到 Hadoop 的 DFS 的文件(可以進行操作,然後使用HDFS的utilitites)。可以用hive.map.aggr控制怎麼進行彙總。默認爲爲true,配置單元會做的第一級聚合直接在MAP上的任務。這通常提供更好的效率,但可能需要更多的內存來運行成功。

Join語句:

連接操作。一些注意事項:
1. Hive只支持等值連接(equality joins)、外連接(outer joins)和(left/right joins)。Hive不支持所有非等值的連接,因爲非等值連接非常難轉化到map/reduce任務。
2. Hive 支持多於2個表的連接。
3. join 時,每次 map/reduce 任務的邏輯: reducer 會緩存 join 序列中除了最後一個表的所有表的記錄, 再通過最後一個表將結果序列化到文件系統。這一實現有助於在reduce端減少內存的使用量。實踐中,應該把最大的那個表寫在最後(否則會因爲緩存浪費大量內存)。
4. LEFT,RIGHT 和 FULL OUTER 關鍵字用於處理 join 中空記錄的情況。
5. LEFT SEMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實現。Hive 當前沒有實現 IN/EXISTS 子查詢,所以你可以用 LEFT SEMI JOIN 重寫你的子查詢語句。LEFT SEMI JOIN的限制是, JOIN子句中右邊的表只能在ON子句中設置過濾條件,在WHERE子句、SELECT子句或其他地方過濾都不行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章