Hive体系结构(三)元数据库与基本操作
Hive體系結(jié)構(gòu)(一)架構(gòu)與基本組成
Hive體系結(jié)構(gòu)(二)Hive的執(zhí)行原理、與關(guān)系型數(shù)據(jù)庫的比較
Hive體系結(jié)構(gòu)(三)元數(shù)據(jù)庫與基本操作
Hive體系結(jié)構(gòu)(四)注意事項(xiàng)與擴(kuò)展特性
1. Hive元數(shù)據(jù)庫
Hive將元數(shù)據(jù)存儲在RDBMS 中,一般常用的有MYSQL和DERBY。
hive元數(shù)據(jù)對應(yīng)的表約有20個(gè),其中和表結(jié)構(gòu)信息有關(guān)的有9張,其余的10多張或?yàn)榭?#xff0c;或只有簡單的幾條記錄,以下是部分主要表的簡要說明。
| TBLS | 所有hive表的基本信息 | TBL_ID,SD_ID |
| TABLE_PARAM | 表級屬性,如是否外部表,表注釋等 | TBL_ID |
| COLUMNS | Hive表字段信息(字段注釋,字段名,字段類型,字段序號) | SD_ID |
| SDS | 所有hive表、表分區(qū)所對應(yīng)的hdfs數(shù)據(jù)目錄和數(shù)據(jù)格式 | SD_ID,SERDE_ID |
| SERDE_PARAM | 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等 | SERDE_ID |
| PARTITIONS | Hive表分區(qū)信息 | PART_ID,SD_ID,TBL_ID |
| PARTITION_KEYS | Hive分區(qū)表分區(qū)鍵 | TBL_ID |
| PARTITION_KEY_VALS | Hive表分區(qū)名(鍵值) | PART_ID |
從上面表的內(nèi)容來看,hive整個(gè)創(chuàng)建表的過程已經(jīng)比較清楚了。
1. 解析用戶提交hive語句,對其進(jìn)行解析,分解為表、字段、分區(qū)等hive對象
2. 根據(jù)解析到的信息構(gòu)建對應(yīng)的表、字段、分區(qū)等對象,從 SEQUENCE_TABLE中獲取構(gòu)建對象的最新ID,與構(gòu)建對象信息(名稱,類型等)一同通過DAO方法寫入到元數(shù)據(jù)表中去,成功后將SEQUENCE_TABLE中對應(yīng)的最新ID+5。
實(shí)際上我們常見的RDBMS都是通過這種方法進(jìn)行組織的,典型的如postgresql,其系統(tǒng)表中和hive元數(shù)據(jù)一樣裸露了這些id信息(oid,cid等),而Oracle等商業(yè)化的系統(tǒng)則隱藏了這些具體的ID。通過這些元數(shù)據(jù)我們可以很容易的讀到數(shù)據(jù)諸如創(chuàng)建一個(gè)表的數(shù)據(jù)字典信息,比如導(dǎo)出建表語名等。
2. Hive基本操作
Create Table語句
一些注意項(xiàng):
1. CREATE TABLE創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用IF NOT EXIST選項(xiàng)來忽略這個(gè)異常。
2. EXTERNAL 關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑( LOCATION ),Hive 創(chuàng)建內(nèi)部表時(shí),會將數(shù)據(jù)移動到數(shù)據(jù)倉庫指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。
3. LIKE允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)。
4. 用戶在建表的時(shí)候可以自定義SerDe或者使用自帶的 SerDe ( Serialize/Deserilize 的簡稱,目的是用于序列化和反序列化 )。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會使用自帶的SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的數(shù)據(jù)。
5. 如果文件數(shù)據(jù)是純文本,可以使用STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用STORED AS SEQUENCE。
6. 有分區(qū)的表可以在創(chuàng)建的時(shí)候使用 PARTITIONED B Y語句。一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每一個(gè)分區(qū)單獨(dú)存在一個(gè)目錄下。而且,表和分區(qū)都可以對某個(gè)列進(jìn)行CLUSTERED BY操作,將若干個(gè)列放入一個(gè)桶(bucket)中。也可以利用SORT BY對數(shù)據(jù)進(jìn)行排序。這樣可以為特定應(yīng)用提高性能。
7. 表名和列名不區(qū)分大小寫,SerDe和屬性名區(qū)分大小寫。表和列的注釋是字符串。
Alter Table語句
主要功能包括Add Partitions, Drop Partitions, Rename Table, Change Column, Add/Replace Columns。
Create View語句
創(chuàng)建視圖。格式CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], …) ]
Show語句
Show tables; Show partitions; describe查看表結(jié)構(gòu)。
Load語句
HIVE裝載數(shù)據(jù)時(shí)沒有做任何轉(zhuǎn)換,加載到表中的數(shù)據(jù)只是進(jìn)入相應(yīng)的配置單元表的位置。Load操作只是單純的復(fù)制/移動操作,將數(shù)
據(jù)文件移動到Hive表對應(yīng)的位置。
Insert語句
插入數(shù)據(jù)。Hive不支持一條一條的用 insert 語句進(jìn)行插入操作,這個(gè)應(yīng)該是與hive的storage layer是有關(guān)系的,因?yàn)樗拇鎯邮荋DFS,插入一個(gè)數(shù)據(jù)要全表掃描,還不如用整個(gè)表的替換來的快些。Hive也不支持update的操作。數(shù)據(jù)是以load的方式,加載到建立好的表中。數(shù)據(jù)一旦導(dǎo)入,則不可修改。要么drop掉整個(gè)表,要么建立新的表,導(dǎo)入新的數(shù)據(jù)。
Drop語句
刪除一個(gè)內(nèi)部表的同時(shí)會同時(shí)刪除表的元數(shù)據(jù)和數(shù)據(jù)。刪除一個(gè)外部表,只刪除元數(shù)據(jù)而保留數(shù)據(jù)。
Limit子句
可以限制查詢的記錄數(shù)。查詢的結(jié)果是隨機(jī)選擇的。下面的查詢語句從 t1 表中隨機(jī)查詢5條記錄,SELECT * FROM t1 LIMIT 5。
Top K查詢
下面的查詢語句查詢銷售記錄最大的 5 個(gè)銷售代表。
SET mapred.reduce.tasks = 1 SELECT * FROM sales SORT BY amount DESC LIMIT 5正則表達(dá)式使用
SELECT語句可以使用正則表達(dá)式做列選擇,下面的語句查詢除了ds和h 之外的所有列:
SELECT `(ds|hr)?+.+` FROM salesSELECT語句
查詢數(shù)據(jù)
Group by, Order by, Sort by子句
聚合可進(jìn)一步分為多個(gè)表,甚至發(fā)送到 Hadoop 的 DFS 的文件(可以進(jìn)行操作,然后使用HDFS的utilitites)。可以用hive.map.aggr控制怎么進(jìn)行匯總。默認(rèn)為為true,配置單元會做的第一級聚合直接在MAP上的任務(wù)。這通常提供更好的效率,但可能需要更多的內(nèi)存來運(yùn)行成功。
Join語句:
連接操作。一些注意事項(xiàng):
1. Hive只支持等值連接(equality joins)、外連接(outer joins)和(left/right joins)。Hive不支持所有非等值的連接,因?yàn)榉堑戎颠B接非常難轉(zhuǎn)化到map/reduce任務(wù)。
2. Hive 支持多于2個(gè)表的連接。
3. join 時(shí),每次 map/reduce 任務(wù)的邏輯: reducer 會緩存 join 序列中除了最后一個(gè)表的所有表的記錄, 再通過最后一個(gè)表將結(jié)果序列化到文件系統(tǒng)。這一實(shí)現(xiàn)有助于在reduce端減少內(nèi)存的使用量。實(shí)踐中,應(yīng)該把最大的那個(gè)表寫在最后(否則會因?yàn)榫彺胬速M(fèi)大量內(nèi)存)。
4. LEFT,RIGHT 和 FULL OUTER 關(guān)鍵字用于處理 join 中空記錄的情況。
5. LEFT SEMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實(shí)現(xiàn)。Hive 當(dāng)前沒有實(shí)現(xiàn) IN/EXISTS 子查詢,所以你可以用 LEFT SEMI JOIN 重寫你的子查詢語句。LEFT SEMI JOIN的限制是, JOIN子句中右邊的表只能在ON子句中設(shè)置過濾條件,在WHERE子句、SELECT子句或其他地方過濾都不行。
總結(jié)
以上是生活随笔為你收集整理的Hive体系结构(三)元数据库与基本操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hive体系结构(二)Hive的执行原理
- 下一篇: hadoop2.20+hive+sqoo