需求
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(...);