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 ;