数仓建设过程中DB层增量到ODS层情况解析

    to_date(days_sub(NOW(), 1)) 前一天日期

背景:每5个小时抽取一次oracle里面6个小时内的数据到DB层,抽完之后,将数据增量到ODS层

 DB层是textfile文件表,ODS层是parquet按天dt分区的表,每个dt里面存的是增量数据,总ODS层表示一份全量数据

 

增量过程中有两种情况,能生成唯一键和没有唯一键的情况

1、对于有唯一键的数据我们操作比较简单,取ods层数据和DB层数据并集,然后开窗函数根据唯一键分组,生成TMP临时表;

最后取TMP表 lv=1的数据写入ODS表

--  #能取唯一键的方式来处理增量
WITH TMP AS
  (SELECT a.*, row_number() over (partition BY LPN_ID    ORDER BY LAST_UPDATE_DATE DESC) AS lv FROM
     (SELECT *    FROM SOURCE_ODS.ODS_WMS_WMS_LICENSE_PLATE_NUMBERS OH
      UNION ALL SELECT *, NOW(), NOW(),TO_DATE(NOW()) AS DT
      FROM SOURCE_DB.DB_WMS_WMS_LICENSE_PLATE_NUMBERS) a)

INSERT OVERWRITE TABLE SOURCE_ODS.ODS_WMS_WMS_LICENSE_PLATE_NUMBERS  PARTITION (DT) SELECT  LPN_ID,LICENSE_PLATE_NUMBER,INVENTORY_ITEM_ID,LAST_UPDATE_DATE,LAST_UPDATED_BY,CATCH_WEIGHT_FLAG,W_INSERT_DATE , W_UPDATE_DATE ,DT   FROM TMP WHERE LV=1;
 

 

2、对没有唯一键的表,取ods层两天之内的所有数据,并且时间小于db层最小时间,将这份数据与DB层数据合并,

合并后的数据写入ODS层对应的分区

 
 -- #不能取唯一键的方式来处理增量,首先我取了
WITH TMP AS
  ( SELECT *   FROM SOURCE_ODS.ODS_WMS_MTL_TRANSACTION_LOT_NUMBERS_OLD
   WHERE last_update_date <       (SELECT LAST_UPDATE_DATE
        FROM SOURCE_DB.DB_WMS_MTL_TRANSACTION_LOT_NUMBERS_OLD
        ORDER BY LAST_UPDATE_DATE ASC
        LIMIT 1) AND dt in (to_date(now()),to_date(days_sub(NOW(), 1)),to_date(days_sub(NOW(), 2))) 
   UNION ALL SELECT *,  NOW(), NOW(),TO_DATE(NOW()) AS DT
   FROM SOURCE_DB.DB_WMS_MTL_TRANSACTION_LOT_NUMBERS_OLD)
INSERT OVERWRITE  TABLE SOURCE_ODS.ODS_WMS_MTL_TRANSACTION_LOT_NUMBERS_OLD PARTITION (DT)
SELECT     TRANSACTION_ID,     LAST_UPDATE_DATE,     LAST_UPDATED_BY,     CREATION_DATE, 
      CREATED_BY,     LAST_UPDATE_LOGIN,     INVENTORY_ITEM_ID,     ORGANIZATION_ID,     LOT_NUMBER,
      W_INSERT_DATE,     W_UPDATE_DATE,     DT  FROM TMP  ;

你可能感兴趣的:(大数据)