学习 Hive(三):分区

分区(partition)是 Hive 优化查询的一种方式。

默认情况下,Hive 中的查询会扫描整张表,当查询一张极大的表时会严重降低查询性能。

在 Hive 中,每个分区对应着一个预定义的分区列,并存储在 HDFS 中表目录的子目录下。

创建分区表

CREATE TABLE IF NOT EXISTS friends_partition  
(
  id INT,
  name STRING
)
PARTITIONED BY (sex STRING)  
ROW FORMAT  
DELIMITED FIELDS TERMINATED BY ',';  

添加分区

ALTER TABLE friends_partition  
ADD PARTITION (sex='m')  

移除分区

ALTER TABLE friends_partition  
DROP PARTITION (sex='m')  

加载 / 插入数据

LOAD DATA LOCAL INPATH '/path/girls.csv' OVERWRITE INTO TABLE friends_partition  
PARTITION (sex='f')  
INSERT INTO TABLE friends_partition PARTITION (sex='m') values (1, 'tom'), (2, 'bob')  

显示分区

SHOW PARTITIONS friends_partition  

显示:

sex=m  
sex=f  

恢复分区

Hive 在 MetaStore 中维护分区信息,然而,当直接在底层 HDFS 上添加或删除分区,MetaStore 是无法感知分区信息变化的。

一种方式是手动执行 ALTER TABLE <TABLE_NAME> ADD/DROP PARTITION,另一种是执行 MetaStore 检查命令:

MSCK REPAIR TABLE friends_partition