一、为什么要分区?
1.将大规模数据按规则(如时间、地域)划分到不同目录,提升数据组织性。
2.通过分区过滤,减少扫描数据量,显著提升查询效率。
3.不同分区可对应不同业务线或权限,增强数据隔离性。
二、如何分区?
核心语法
CREATE TABLE table_name(
col1 STRING,
col2 INT
)
PARTITIONED BY (partition_col STRING, ...) -- 分区字段定义
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
分区字段:独立于表结构的伪列,物理存储为 HDFS 目录,查询时可直接使用。
分级分区:支持多级分区(如PARTITIONED BY (year, month, day)
),对应多级目录。
三、分区实战
1. 一级分区(单字段分区)
场景:按日期分区(如dt=20230825
)。
步骤:
- 建表:
CREATE TABLE user_log( uid STRING, action STRING ) PARTITIONED BY (dt STRING);
- 加载数据:
LOAD DATA LOCAL INPATH '/data/user1.txt' INTO TABLE user_log PARTITION (dt='20230825');
- 查询:
SELECT * FROM user_log WHERE dt='20230825'; -- 直接使用分区字段过滤
2. 二级分区(双字段分区)
建表:
CREATE TABLE order_data(
order_id STRING,
amount DOUBLE
)
PARTITIONED BY (country STRING, date STRING);
加载数据:
LOAD DATA INPATH '/data/order_us_202308.txt' INTO TABLE order_data
PARTITION (country='us', date='20230801');
3. 分区字段大小写测试
字段名:不区分大小写(如PARTITIONED BY (Dt STRING)
与dt
等价)。
字段值:区分大小写(如dt='20230825'
与Dt='20230825'
视为不同分区)。
四、分区操作高级技巧
1. 动态分区(重点)
场景:根据数据内容自动创建分区(如按订单国家和日期动态分区)。
步骤:
- 配置参数:
SET hive.exec.dynamic.partition=true; -- 开启动态分区(默认开启) SET hive.exec.dynamic.partition.mode=nonstrict; -- 非严格模式(允许全动态分区) SET hive.exec.max.dynamic.partitions.pernode=500; -- 单节点最大分区数
- 创建目标表:
CREATE TABLE order_dynamic( order_id STRING ) PARTITIONED BY (country STRING, order_date STRING);
- 动态插入数据:
INSERT OVERWRITE TABLE order_dynamic PARTITION (country, order_date) SELECT order_id, country, order_date FROM raw_orders; -- 分区字段需为SELECT后两位
2. 混合分区(静态 + 动态)
场景:固定年份 + 动态月日分区。
示例:
INSERT INTO dy_part2 PARTITION (year='2019', month, day) -- year为静态分区,month/day为动态
SELECT id, name, month, day FROM temp_part2;
3. 分区管理命令
添加分区:
ALTER TABLE user_log ADD PARTITION (dt='20230826'); -- 空分区
ALTER TABLE user_log ADD PARTITION (dt='20230827') LOCATION '/hive/user_log/dt=20230827'; -- 指定路径
ALTER TABLE user_log DROP PARTITION (dt='20230825');
SHOW PARTITIONS user_log;
五、分区数据关联的三种方式
- 方式一:上传数据后修复(适合非 Hive 创建的分区)
MSCK REPAIR TABLE user_log; -- 自动扫描HDFS目录并关联元数据
- 方式二:手动添加分区
使用ALTER TABLE ADD PARTITION
命令,需指定分区路径。 - 方式三:LOAD 直接写入分区
在建表后直接通过LOAD ... PARTITION
加载数据,自动创建分区。
六、分区类型对比
类型 | 特点 | 适用场景 |
---|---|---|
静态分区 | 分区字段值在插入时明确指定,需提前规划 | 已知分区规则的历史数据 |
动态分区 | 分区字段值由数据动态生成,无需预先创建 | 实时数据或未知分区场景 |
混合分区 | 部分静态 + 部分动态,平衡灵活性与可控性 | 固定维度 + 变化维度组合 |