更新时间:2026-10-16 GMT+08:00
动态分区
动态分区是指在往分区表里插入数据时,可以在分区中指定一个分区列名,但不给出具体值,而是在SELECT子句中的对应列来提供分区值的一种语法。在SQL运行之前不知道会产生哪些分区,只有在SQL语句运行结束后,才能根据分区列产生的值确定会产生哪些分区。
根据动态分区插数据时Map阶段就存在的数据倾斜问题,可通过查找到存在记录数较多的分区裁剪后单独插入的方式解决,具体步骤如下。
- 使用如下命令示例查询记录数较多的特定分区。
SELECT ds, hh, COUNT(*) AS cnt FROM dwd_alsc_ent_shop_info_hi GROUP BY ds, hh ORDER BY cnt DESC;
部分分区如下:
ds
hh
cnt
20200928
17
1052800
20191017
17
1041234
20210928
17
1034332
20190328
17
1000321
20210504
1
19
20191003
20
18
20200522
1
18
20220504
1
18
- 使用如下命令示例过滤上述分区插入后,再单独插入大记录数分区数据。
-- 小分区批量插入 INSERT OVERWRITE TABLE data_demo3 PARTITION(ds, hh) SELECT * FROM dwd_alsc_ent_shop_info_hi WHERE concat(ds, hh) NOT IN ('2020092817','2019101717','2021092817','2019032817'); -- 大分区单独插入(可配合 repartition 控制并发) INSERT OVERWRITE TABLE data_demo3 PARTITION(ds, hh) SELECT * FROM dwd_alsc_ent_shop_info_hi WHERE concat(ds, hh) IN ('2020092817','2019101717','2021092817','2019032817'); -- 验证 SELECT ds, hh, COUNT(*) AS cnt FROM dwd_alsc_ent_shop_info_hi GROUP BY ds, hh ORDER BY cnt DESC;
父主题: 数据倾斜排查及解决方法