Hive的表分区比较简单,就是将同一组数据放到同一个HDFS目录下,当查询中过滤条件指定了某一个分区值时,只将该分区对应的目录作为Input,从而减少MapReduce的输入数据,提高查询效率。
创建分区
CREATE EXTERNAL TABLE t_lxw1234 (
id INT,
ip STRING COMMENT ‘访问者IP’,
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT ‘lxw的大数据田地-lxw1234.com’
PARTITIONED BY (month STRING, day STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,’
STORED AS textfile;
在创建表的时候,使用PARTITIONED BY 关键字来指定该表为分区表,后面的括号中指定来分区的字段和类型,分区字段可以有多个,在HDFS中对应多级目录。
比如,上面的表t_lxw1234分区month=‘2015-06’,day='2015-06-15’对应HDFS上的路径为 /usr/hive/warehouse/default.db/t_lxw1234/month=2015-06/day=2015-06-15, 当查询中指定了 month=‘2015-06’ AND day=‘2015-06-15’, MapReduce 将month= 2015-06/下所有的目录都作为input。
添加分区
- 使用insert添加分区
往分区中追加数据:
INSERT INTO TABLE t_lxw1234 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)
SELECT * FROM dual;
覆盖分区数据:
INSERT overwrite TABLE t_lxw1234 PARTITION (month = ‘2015-06′,day = ‘2015-06-15′)
SELECT * FROM dual;
- 使用ALTER TABLE添加分区:
ALTER TABLE t_lxw1234 ADD PARTITION (month = ‘2015-06′,day = ‘2015-06-15′) location ‘hdfs://namenode/tmp/lxw1234/month=2015-06/day=2015-06-15/';
查看分区对应的HDFS路径
使用show partitions t_lxw1234
查看表的所有分区
删除分区
可以用下面的命令来删除分区
ALTER TABLE t_lxw1234 DROP PARTITION (month = ‘2015-01’, day = ‘2015-01-25’);
同内部表和外部表,如果该表为外部表,则分区对应的HDFS目录数据不会被删除。
动态分区
关系型数据库中,对分区表insert数据时,数据库自动会根据分区字段的值,将数据插入到相应的分区中,hive也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。
参考链接:http://lxw1234.com/archives/2015/06/286.htm