一七婴、背景
1官还、在Hive Select查詢中一般會掃描整個表內(nèi)容,會消耗很多時間做沒必要的工作讥耗。有時候只需要掃描表中關(guān)心的一部分?jǐn)?shù)據(jù)有勾,因此建表時引入了partition概念。
2古程、分區(qū)表指的是在創(chuàng)建表時指定的partition的分區(qū)空間蔼卡。
3、如果需要創(chuàng)建有分區(qū)的表挣磨,需要在create表的時候調(diào)用可選參數(shù)partitioned by雇逞,詳見表創(chuàng)建的語法結(jié)構(gòu)。
二茁裙、技術(shù)細(xì)節(jié)
1塘砸、一個表可以擁有一個或者多個分區(qū),每個分區(qū)以文件夾的形式單獨存在表文件夾的目錄下呜达。
2谣蠢、表和列名不區(qū)分大小寫。
3查近、分區(qū)是以字段的形式在表結(jié)構(gòu)中存在眉踱,通過describe table命令可以查看到字段存在,但是該字段不存放實際的數(shù)據(jù)內(nèi)容霜威,僅僅是分區(qū)的表示谈喳。
4、建表的語法(建分區(qū)可參見PARTITIONED BY參數(shù)):
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
5戈泼、分區(qū)建表分為2種婿禽,一種是單分區(qū),也就是說在表文件夾目錄下只有一級文件夾目錄大猛。另外一種是多分區(qū)扭倾,表文件夾下出現(xiàn)多文件夾嵌套模式。
a挽绩、單分區(qū)建表語句:create table day_table (id int, content string) partitioned by (dt string);單分區(qū)表膛壹,按天分區(qū),在表結(jié)構(gòu)中存在id唉堪,content模聋,dt三列。
b唠亚、雙分區(qū)建表語句:create table day_hour_table (id int, content string) partitioned by (dt string, hour string);雙分區(qū)表链方,按天和小時分區(qū),在表結(jié)構(gòu)中新增加了dt和hour兩列灶搜。
表文件夾目錄示意圖(多分區(qū)表):
6祟蚀、添加分區(qū)表語法(表已創(chuàng)建,在此基礎(chǔ)上添加分區(qū)):
ALTER TABLE table_name ADD partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
用戶可以用?ALTER TABLE ADD PARTITION?來向一個表中增加分區(qū)割卖。當(dāng)分區(qū)名是字符串時加引號前酿。例:
ALTER TABLE day_table ADD PARTITION (dt='2008-08-08', hour='08') location '/path/pv1.txt' PARTITION (dt='2008-08-08', hour='09') location '/path/pv2.txt';
7、刪除分區(qū)語法:
ALTER TABLE table_name DROP partition_spec, partition_spec,...
用戶可以用?ALTER TABLE DROP PARTITION?來刪除分區(qū)究珊。分區(qū)的元數(shù)據(jù)和數(shù)據(jù)將被一并刪除薪者。例:
ALTER TABLE day_hour_table DROP PARTITION (dt='2008-08-08', hour='09');
8、數(shù)據(jù)加載進(jìn)分區(qū)表中語法:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
例:
LOAD DATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08- 08', hour='08'); LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hour partition(dt='2010-07- 07');
當(dāng)數(shù)據(jù)被加載至表中時剿涮,不會對數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換言津。Load操作只是將數(shù)據(jù)復(fù)制至Hive表對應(yīng)的位置。數(shù)據(jù)加載時在表下自動創(chuàng)建一個目錄取试,文件存放在該分區(qū)下悬槽。
9、基于分區(qū)的查詢的語句:
SELECT day_table.* FROM day_table WHERE day_table.dt>= '2008-08-08';
10瞬浓、查看分區(qū)語句:
hive> show partitions day_hour_table; OK dt=2008-08-08/hour=08 dt=2008-08-08/hour=09 dt=2008-08-09/hour=09
三初婆、總結(jié)
1、在?Hive?中,表中的一個?Partition?對應(yīng)于表下的一個目錄磅叛,所有的?Partition?的數(shù)據(jù)都存儲在最字集的目錄中屑咳。
2、總的說來partition就是輔助查詢弊琴,縮小查詢范圍兆龙,加快數(shù)據(jù)的檢索速度和對數(shù)據(jù)按照一定的規(guī)格和條件進(jìn)行管理。