分区简介
Hive在对数据进行查询的时候一般会对整个表进行扫描,当表很大的时候会消耗很多时间,有时候只是需要对表中的一部分数据进行扫描,因此Hive引入分区。
Hive分区不同于一般分布式系统下的范围分区,哈希分区,一致性分区等。
Hive的分区是在Hive的表结构下面根据分区的字段设置将数据按照目录进行存放,相当于简单的索引功能。
Hive表分区需要在创建表的时候指定模式(Hive创建表的时候指定模式的语句:
PARTITIONED BY (part_1 STRING,part_2 STRING))才能够使用。它的字段指定的是虚拟的列,在实际的表中并不存在,在Hive表分区的模式下可以指定多级结构,相当于对目录进行嵌套。
Hive表分区操作主要包含创建分区,增加分区和删除分区。
创建分区在创建表的时候完成,具体参考:Hive创建表.
(1)增加分区
ALTER TABLE table_name ADD partition_spec [LOCATION 'location'] partition_spec [LOCATION 'location']...
partition_spec::PARTITION (partition_col = partition_col_name,partition_col = partition_col_name,...)
查看表结构:
hive>
describe test_table_partition;
OK
name string
userid int
ip string ip address of the user
part_1 string
part_2 string
# Partition Information
# col_name data_type comment
part_1 string
part_2 string
Time taken: 0.125 seconds, Fetched: 11 row(s)
增加分区:
hive>
ALTER TABLE test_table_partition ADD
> PARTITION (part_1 = 'part_1_1',part_2='part_2_1')
> LOCATION '/user/hive/testpartition1'
> PARTITION (part_1 = 'part_1_2',part_2 = 'part_2_2')
> LOCATION '/user/hive/testpartition2';
OK
Time taken: 0.838 seconds
查看增加分区后的表目录结构:
caiyong@caiyong:/opt/hadoop$
bin/hadoop fs -ls /user/hive/
Found 4 items
drwxr-xr-x - caiyong supergroup 0 2015-03-11 11:14 /user/hive/outtable
drwxr-xr-x - caiyong supergroup 0 2015-03-11 15:01 /user/hive/testpartition1
drwxr-xr-x - caiyong supergroup 0 2015-03-11 15:01 /user/hive/testpartition2
drwxr-xr-x - caiyong supergroup 0 2015-03-11 12:21 /user/hive/warehouse
(2)删除分区
ALTER TABLE table_name DROP partition_spec ,partition_spec ......
删除分区的时候,分区的元数据和数据将会被一并删除。
删除分区:
hive>
ALTER TABLE test_table_partition DROP PARTITION(part_1 = 'part_1_1',part_2 = 'part_2_1');
Dropped the partition part_1=part_1_1/part_2=part_2_1
OK
Time taken: 2.959 seconds
查看删除分区后的表目录结构:
caiyong@caiyong:/opt/hadoop$
bin/hadoop fs -ls /user/hive
Found 3 items
drwxr-xr-x - caiyong supergroup 0 2015-03-11 11:14 /user/hive/outtable
drwxr-xr-x - caiyong supergroup 0 2015-03-11 15:01 /user/hive/testpartition2
drwxr-xr-x - caiyong supergroup 0 2015-03-11 12:21 /user/hive/warehouse
注意:当没有声明模式的时候不能为表指定具体的分区,分区名不能与表字段名重复。