分区(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