# 动态分区
动态分区是指在往分区表里插入数据时，可以在分区中指定一个分区列名，但不给出具体值，而是在SELECT子句中的对应列来提供分区值的一种语法。在SQL运行之前不知道会产生哪些分区，只有在SQL语句运行结束后，才能根据分区列产生的值确定会产生哪些分区。
根据动态分区插数据时Map阶段就存在的数据倾斜问题，可通过查找到存在记录数较多的分区裁剪后单独插入的方式解决，具体步骤如下。
1. 使用如下命令示例查询记录数较多的特定分区。
   ```
   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         |
      
   
2. 使用如下命令示例过滤上述分区插入后，再单独插入大记录数分区数据。
   ```
   -- 小分区批量插入
   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;
   ```
   
 
