Hive Select查询一般会扫描整个表的内容,这样的话会消耗很多时间。有时候只需要扫面表中我们需要的一部分数据,因此建表的时候引入了partition,分区表的概念。分区是以字段的形式在表结构中存在,但是该字段不存放实际的数据内容,也可以理解为一种特定的目录结构。
对于每一个表或者分区,hive又可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
1.Hive分区
CREATE TABLE part_table(id int,name String,ip String,city String,date String)
PARTITIONED BY (part_flag String)//这里的分区字段可以是表中字段也可以是指定的字段
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
load data local inpath '/home/xudong/test.txt' into table part_table partition(part_flag='part1');
load data local inpath '/home/xudong/test1.txt' into table part_table partition(part_flag='part2');
select * from part_table where part_flag='part1';
load data local inpath '/home/xudong/test.txt' into table part_table partition(part_flag='part1');
load data local inpath '/home/xudong/test1.txt' into table part_table partition(part_flag='part2');
这里的分区类似一种目录结构:
将test.txt文件导入hive表part_table中分区是part1,将test1.txt文件导入hive表part_table中分区是part2,目录结构显示是:
/user/hive/warehouse/xudong.db/part_table/part1/test.txt
/user/hive/warehouse/xudong.db/part_table/part2/test1.txt
2.hive分桶
CREATE TABLE part_table(id int,name String,ip String,city String,date String)
CLUSTERED BY (id) INTO 4 BUCKETS;