范围分区-思考

  • 按月分区
    之前的模型设计师及架构师留下的表分区为STRING型的etl_time:20181222153000(年月日时分秒)


    image.png

业务人员使用时经常用时间取数,导致需要截取etl_time,效率比直接查询分区字段原始值慢两倍。


image.png

思考: 若是重新分区,基于现在的业务场景及数据使用方便层面,我更倾向于年月-日-时

  • 同样是按月分区,这样会在年月目录中存储单月30天的目录数据;


    image.png
  • 天目录下有时目录( 甚至可以天时一层目录,因为一天只保留一份当天全量数据)

后续: 若是需要批量修改底层表的分区字段及分区字段值
思路:

  • 将类似etl_time:20181222153000的字段分两列: etl_date: 20181222 etl_time: 153000(根据使用场景决定time存储时分秒)

    -- 检查数据是否备份至临时表,此步骤决定是否执行下一步
    CREATE TABLE 临时表 AS orc AS SELECT * FROM 原表;  
    - 这期间耗时会根据表量、数据量决定
    - DROP TABLE 原表;  -- 检查数据已备份至临时表,再执行此步骤
    CREATE TABLE 新表 (业务字段,分列字段,分区字段);   —- 分区字段参考etl_date
    INSERT INTO 新表 (业务字段,分列字段,分区字段)  -- 检查数据是否完整
    select
    业务字段
    ,SUBSTRING(20181222153000,1,8)
    ,SUBSTRING(20181222153000,9,6)
    FROM 临时表;
    -- 备份历史数据-插数据还是挺快的,秒级几十万条(单条数据约为0.005KB)
    ...
    

你可能感兴趣的:(范围分区-思考)