在 Hive 中,分区(Partition)是把数据按照某些列的值进行物理目录划分,从而提升查询效率、减少扫描数据量。下面从概念、建表、加载数据、动态分区、管理等方面系统说明。
/user/hive/warehouse/db.db/table/dt=2024-01-01/
/user/hive/warehouse/db.db/table/dt=2024-01-02/
WHERE dt='2024-01-01' 直接定位目录CREATE TABLE user_log (
user_id STRING,
action STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
dt是分区字段
CREATE TABLE order_detail (
order_id STRING,
amount DOUBLE
)
PARTITIONED BY (dt STRING, region STRING)
STORED AS PARQUET;
目录结构:
/dt=2024-01-01/region=beijing/
/dt=2024-01-01/region=shanghai/
LOAD DATA LOCAL INPATH '/data/log_20240101.txt'
INTO TABLE user_log
PARTITION (dt='2024-01-01');
INSERT INTO TABLE user_log PARTITION (dt='2024-01-01')
SELECT user_id, action
FROM temp_log
WHERE log_date='2024-01-01';
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO TABLE user_log PARTITION (dt)
SELECT
user_id,
action,
log_date AS dt
FROM temp_log;
✅ dt 的值由 SELECT 最后一列自动决定
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT INTO TABLE order_detail PARTITION (dt, region)
SELECT
order_id,
amount,
order_date,
area
FROM temp_order;
SHOW PARTITIONS user_log;
ALTER TABLE user_log
ADD PARTITION (dt='2024-01-03')
LOCATION '/user/hive/warehouse/db.db/user_log/dt=2024-01-03';
ALTER TABLE user_log DROP PARTITION (dt='2024-01-03');
✅ 适合做分区的字段:
❌ 不适合:
✅ 建议:
| 格式 | 说明 |
|---|---|
| TEXTFILE | 默认,适合日志 |
| ORC | 压缩好,查询快 |
| PARQUET | 列式,分析友好 |
如果你有:
我可以帮你设计最优分区方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。