更新时间:2026-10-16 GMT+08:00
分享

动态分区

动态分区是指在往分区表里插入数据时,可以在分区中指定一个分区列名,但不给出具体值,而是在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;

相关文档