需求
select * from t1 ?where xxxx;
這是全表掃描的。實際應用中,有時候不一定需要全表掃描。
比如電信的日志文件,一個表里存了從去年到現在的日志文件,那是很多很大的,實際需求要查今天的,如果用上面的sql,要全部掃描,很耗時間和機器資源,怎么辦?
可以把文件分區存放,比如按天劃分,查詢時,指定分區。于是,分區表出來了。
概述
分區可以理解為分類,通過分類把不同類型的數據放到不同的目錄下。
分類的標準就是分區字段,可以一個,也可以多個。
分區表的意義在于優化查詢。查詢時盡量利用分區字段。如果不使用分區字段,就會全部掃描。
語法
建表
CREATE TABLE tmp_table #表名
(
title ? string, # 字段名稱 字段類型
minimum_bid ? ? double,
quantity ? ? ? ?bigint,
have_invoice ? ?bigint
)COMMENT '注釋:XXX' #表注釋
?PARTITIONED BY(pt STRING) #分區表字段(如果你文件非常之大的話,采用分區表可以快過濾出按分區字段劃分的數據)
?ROW FORMAT DELIMITED?
? ?FIELDS TERMINATED BY '\t' ? # 字段是用什么分割開的
STORED AS SEQUENCEFILE; #用哪種方式存儲數據,SEQUENCEFILE是hadoop自帶的文件壓縮格式
修改表
alter table t2 add partition(class='job5');
hive>SHOW PARTITIONS t3 [partition (province='beijing')];
hive>ALTER TABLE t3 ADD [IF NOT EXISTS] PARTITION(...) LOCATION '...';
hive>ALTER TABLE t3 DROP PARTITION(...);
實驗
[root@hello110 data]# cat ?partition_test;
1 ? ? ? dddd ? ?dddd
2 ? ? ? www ? ? www
3 ? ? ? eeee ? ?wwww
4 ? ? ? tttt ? ?cccc
5 ? ? ? yyycc ? dddd
創建表
hive (zmgdb)> create table p_t1(name string,post string,address string)
? ? ? ? ? ? > partitioned by (city string)
? ? ? ? ? ? > row format delimited fields terminated by '\t'
? ? ? ? ? ? > ;
OK
Time taken: 0.106 seconds
導入數據到北京分區
hive (zmgdb)> load data local inpath '/data/partition_test' into table p_t1 partition(city='beijing');
Loading data to table zmgdb.p_t1 partition (city=beijing)
OK
Time taken: 0.577 seconds
導入數據到寧波分區
hive (zmgdb)> load data local inpath '/data/partition_test' into table p_t1 partition(city='ningbo');
Loading data to table zmgdb.p_t1 partition (city=ningbo)
OK
Time taken: 0.403 seconds
導入數據到臺州分區
hive (zmgdb)> load data local inpath '/data/partition_test' into table p_t1 partition(city='taizhou');
Loading data to table zmgdb.p_t1 partition (city=taizhou)
OK
Time taken: 0.343 seconds
顯示分區
hive (zmgdb)> show partitions p_t1;
OK
partition
city=beijing
city=ningbo
city=taizhou
Time taken: 0.083 seconds, Fetched: 3 row(s)
查看全部數據,全表
hive (zmgdb)> select * from p_t1;
OK
p_t1.name ? ? ? p_t1.post ? ? ? p_t1.address ? ?p_t1.city
1 ? ? ? dddd ? ?dddd ? ?beijing
2 ? ? ? www ? ? www ? ? beijing
3 ? ? ? eeee ? ?wwww ? ?beijing
4 ? ? ? tttt ? ?cccc ? ?beijing
5 ? ? ? yyycc ? dddd ? ?beijing
1 ? ? ? dddd ? ?dddd ? ?ningbo
2 ? ? ? www ? ? www ? ? ningbo
3 ? ? ? eeee ? ?wwww ? ?ningbo
4 ? ? ? tttt ? ?cccc ? ?ningbo
5 ? ? ? yyycc ? dddd ? ?ningbo
1 ? ? ? dddd ? ?dddd ? ?taizhou
2 ? ? ? www ? ? www ? ? taizhou
3 ? ? ? eeee ? ?wwww ? ?taizhou
4 ? ? ? tttt ? ?cccc ? ?taizhou
5 ? ? ? yyycc ? dddd ? ?taizhou
Time taken: 0.105 seconds, Fetched: 15 row(s)
按分區查詢,查寧波分區,city='ningbo' 是分區
hive (zmgdb)> select * from p_t1 where city='ningbo';
OK
p_t1.name ? ? ? p_t1.post ? ? ? p_t1.address ? ?p_t1.city
1 ? ? ? dddd ? ?dddd ? ?ningbo
2 ? ? ? www ? ? www ? ? ningbo
3 ? ? ? eeee ? ?wwww ? ?ningbo
4 ? ? ? tttt ? ?cccc ? ?ningbo
5 ? ? ? yyycc ? dddd ? ?ningbo
Time taken: 0.723 seconds, Fetched: 5 row(s)
hive>SHOW PARTITIONS t3 [partition (province='beijing')];
hive>ALTER TABLE t3 ADD [IF NOT EXISTS] PARTITION(...) LOCATION '...';
hive>ALTER TABLE t3 DROP PARTITION(...);