Hive中的表分区

Hive中的表分区比较简单,就是将同一组数据放到同一个HDFS目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为Input,从而减少MapReduce的输入数据,提高查询效率。

 

创建分区表

CREATE EXTERNAL TABLE t_1 (

id INT,

ip STRING

) COMMENT ‘分区表’

PARTITIONED BY (month STRING, day STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ‘,’

STORED AS textfile;

 

  • 在创建表时候,使用PARTITIONED BY关键字来指定该表为分区表,后面括号中指定了分区的字段和类型,分区字段可以有多个,在HDFS中对应多级目录。
  • 比如,上面的表t_1分区month=’2015-06’,day=’2015-06-15’对应HDFS上的路径为:/user/hive/warehouse/default.db/t_1/month=2015-06/day=2015-06-15/,当查询中指定了month=’2015-06’ AND day=’2015-06-15’,MapReduce直接从该目录中读取数据,如果只指定了month=’2015-06’,那么MapReduce将/month=2015-06/下所有的子目录都作为Input。

添加分区

  • 使用INSERT添加分区:

往分区中追加数据:

INSERT INTO TABLE t_1 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)

SELECT * FROM dual;

覆盖分区数据:

INSERT overwrite TABLE t_1 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)

SELECT * FROM dual;

  • 使用ALTER TABLE添加分区:

ALTER TABLE t_1 ADD PARTITION (month = ‘2015-06′,day = ‘2015-06-15′) location ‘hdfs://namenode/tmp/l1/month=2015-06/day=2015-06-15/';

查看分区对应的HDFS路径

  • 使用命令 show partitions t_1; 查看表的所有分区:

hive> show partitions t_1

OK

month=2015-01/day=2015-01-25

month=2015-01/day=2015-01-31

month=2015-02/day=2015-02-15

month=2015-02/day=2015-02-28

month=2015-03/day=2015-03-15

month=2015-03/day=2015-03-31

  • 使用desc formatted t_1 partition (month = ‘2015-01’ , day = ‘2015-01-25′);

查看该分区的详细信息,包括该分区在HDFS上的路径:

Location:               hdfs://namenode/user/hive/warehouse/default.db/t_1/month=2015-01/day=2015-01-25/

 删除分区

可以使用 ALTER TABLE t_1 DROP PARTITION (month = ‘2015-01’, day = ‘2015-01-25’);

删除一个分区;

同内部表和外部表,如果该分区表为外部表,则分区对应的HDFS目录数据不会被删除。

 动态分区

使用动态分区需要注意设定以下参数:

  • hive.exec.dynamic.partition

默认值:false

是否开启动态分区功能,默认false关闭。

使用动态分区时候,该参数必须设置成true;

  • hive.exec.dynamic.partition.mode

默认值:strict

动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。

一般需要设置为nonstrict

  • hive.exec.max.dynamic.partitions.pernode

默认值:100

在每个执行MR的节点上,最大可以创建多少个动态分区。

该参数需要根据实际的数据来设定。

比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。

  • hive.exec.max.dynamic.partitions

默认值:1000

在所有执行MR的节点上,最大一共可以创建多少个动态分区。

同上参数解释。

  • hive.exec.max.created.files

默认值:100000

整个MR Job中,最大可以创建多少个HDFS文件。

一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

  • hive.error.on.empty.partition

默认值:false

当有空分区生成时,是否抛出异常。

一般不需要设置。