同關(guān)系型數(shù)據(jù)庫(kù)一樣,Hive中也支持視圖(View)和分區(qū)(Partition),但與關(guān)系型數(shù)據(jù)庫(kù)中的有所區(qū)別幔睬,本文簡(jiǎn)單介紹Hive中視圖和分區(qū)的示例。
在真實(shí)業(yè)務(wù)場(chǎng)景下芹扭,視圖的應(yīng)用比較少麻顶,分區(qū)使用的非常多,因此建議對(duì)分區(qū)這塊多花的時(shí)間來了解舱卡。
四辅肾、Hive的視圖和分區(qū)
4.1 Hive中的視圖
和關(guān)系型數(shù)據(jù)庫(kù)一樣,Hive中也提供了視圖的功能轮锥,注意Hive中視圖的特性矫钓,和關(guān)系型數(shù)據(jù)庫(kù)中的稍有區(qū)別:
- 只有邏輯視圖,沒有物化視圖舍杜;
- 視圖只能查詢新娜,不能Load/Insert/Update/Delete數(shù)據(jù);
- 視圖在創(chuàng)建時(shí)候既绩,只是保存了一份元數(shù)據(jù)概龄,當(dāng)查詢視圖的時(shí)候,才開始執(zhí)行視圖對(duì)應(yīng)的那些子查詢饲握;
4.1.1 創(chuàng)建視圖
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], …) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, …)]
AS SELECT …;
例如:
CREATE VIEW IF NOT EXISTS v_lxw1234 (url COMMENT ‘url’)
COMMENT ‘view lxw1234′
AS SELECT url FROM lxw1234
WHERE url LIKE ‘http://%’
LIMIT 100;
4.1.2 刪除視圖
DROP VIEW IF EXISTS v_lxw1234;
4.1.3 修改視圖
ALTER VIEW v_lxw1234 AS
SELECT url FROM lxw1234 limit 500;
更多關(guān)于Hive視圖的介紹私杜,請(qǐng)參考官方文檔:
4.2 Hive中的表分區(qū)
Hive中的表分區(qū)比較簡(jiǎn)單,就是將同一組數(shù)據(jù)放到同一個(gè)HDFS目錄下救欧,當(dāng)查詢中過濾條件指定了某一個(gè)分區(qū)值時(shí)候歪今,只將該分區(qū)對(duì)應(yīng)的目錄作為Input,從而減少M(fèi)apReduce的輸入數(shù)據(jù)颜矿,提高查詢效率寄猩。
4.2.1 創(chuàng)建分區(qū)表
CREATE EXTERNAL TABLE t_lxw1234 (
id INT,
ip STRING COMMENT ‘訪問者IP’,
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT ‘lxw的大數(shù)據(jù)田地-lxw1234.com’
PARTITIONED BY (month STRING, day STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,’
STORED AS textfile;
- 在創(chuàng)建表時(shí)候,使用PARTITIONED BY關(guān)鍵字來指定該表為分區(qū)表骑疆,后面括號(hào)中指定了分區(qū)的字段和類型田篇,分區(qū)字段可以有多個(gè),在HDFS中對(duì)應(yīng)多級(jí)目錄箍铭。
- 比如泊柬,上面的表t_lxw1234分區(qū)month=’2015-06’,day=’2015-06-15’對(duì)應(yīng)HDFS上的路徑為:/user/hive/warehouse/default.db/t_lxw1234/month=2015-06/day=2015-06-15/,當(dāng)查詢中指定了month=’2015-06’ AND day=’2015-06-15’,MapReduce直接從該目錄中讀取數(shù)據(jù)诈火,如果只指定了month=’2015-06’兽赁,那么MapReduce將/month=2015-06/下所有的子目錄都作為Input。
4.2.2 添加分區(qū)
- 使用INSERT添加分區(qū):
往分區(qū)中追加數(shù)據(jù):
INSERT INTO TABLE t_lxw1234 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)
SELECT * FROM dual;
覆蓋分區(qū)數(shù)據(jù):
INSERT overwrite TABLE t_lxw1234 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)
SELECT * FROM dual;
- 使用ALTER TABLE添加分區(qū):
ALTER TABLE t_lxw1234 ADD PARTITION (month = ‘2015-06′,day = ‘2015-06-15′) location ‘hdfs://namenode/tmp/lxw1234/month=2015-06/day=2015-06-15/';
4.2.3 查看分區(qū)對(duì)應(yīng)的HDFS路徑
- 使用命令 show partitions t_lxw1234; 查看表的所有分區(qū):
hive> show partitions t_lxw1234;
OK
month=2015-01/day=2015-01-25
month=2015-01/day=2015-01-31
month=2015-02/day=2015-02-15
month=2015-02/day=2015-02-28
month=2015-03/day=2015-03-15
month=2015-03/day=2015-03-31
- 使用desc formatted t_lxw1234 partition (month = ‘2015-01’ , day = ‘2015-01-25′);
查看該分區(qū)的詳細(xì)信息,包括該分區(qū)在HDFS上的路徑:
Location: hdfs://namenode/user/hive/warehouse/default.db/t_lxw1234/month=2015-01/day=2015-01-25/
4.2.4 刪除分區(qū)
可以使用 ALTER TABLE t_lxw1234 DROP PARTITION (month = ‘2015-01’, day = ‘2015-01-25’);
刪除一個(gè)分區(qū)刀崖;
同內(nèi)部表和外部表惊科,如果該分區(qū)表為外部表,則分區(qū)對(duì)應(yīng)的HDFS目錄數(shù)據(jù)不會(huì)被刪除亮钦。
更多關(guān)于分區(qū)的介紹馆截,可參考官方文檔:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AddPartitions
Hive相關(guān)文章(持續(xù)更新):
—-Hive中的數(shù)據(jù)庫(kù)(Database)和表(Table)
hive優(yōu)化之——控制hive任務(wù)中的map數(shù)和reduce數(shù)
如果覺得本博客對(duì)您有幫助蜂莉,請(qǐng) 贊助作者 蜡娶。
轉(zhuǎn)載請(qǐng)注明:lxw的大數(shù)據(jù)田地 ? [一起學(xué)Hive]之五-Hive的視圖和分區(qū)