先去看这篇文章:https://www.cnblogs.com/lxbmaomao/p/9821128.html
然后重点是这部分(从文章开头看到下面我截图这部分就行):
首先,下面的user表没有用到。。而且貌似也没有用,文章中为什么要user表我也搞不懂。。明明user的拉链表可以就包含了user全量表的数据了。。
由于hdfs和hive的底层因素,不支持修改操作。所以修改数据只能先把数据查询出来,修改完后再覆盖原本的数据。
我对上述insert sql的理解:
先查询拉链表的数据,修改相关数据为旧的历史记录,把每日更新表数据作为新的历史记录。然后把结果覆盖回拉链表。
UNION联合的两个select的理解:
1、第一个select:
- SELECT A.user_num,
- A.mobile,
- A.reg_date,
- A.t_start_time,
- CASE
- WHEN A.t_end_time = '9999-12-31' AND B.user_num IS NOT NULL THEN '2017-01-01'
- ELSE A.t_end_time
- END AS t_end_time
- FROM dws.user_his A
- LEFT JOIN ods.user_update B
- ON A.user_num = B.user_num
我对这个select理解:
(1)条件A.t_end_time = '9999-12-31' :表示拉链表中的旧的有效记录
(2)dws.user_his A LEFT JOIN ods.user_update B,并且B.user_num IS NOT NULL :表示拉链表中的该记录存在与每日更新表中,该记录的有效日期应该被修改为昨日日期。
总:拉链表中的有效记录 与每日更新表关联,如果数据存在关联的,则把该关联的数据中的t_end_time改为昨日(这里是:'2017-01-01' ),表示该记录在昨天失效。。。而新的有效数据则由下一个select中导入。
所以,第一个select是修改拉链表旧数据,根据每日更新表的数据,把有效截止日期改为昨日。
2、第二个select
- SELECT C.user_num,
- C.mobile,
- C.reg_date,
- '2017-01-02' AS t_start_time,
- '9999-12-31' AS t_end_time
- FROM ods.user_update AS C
根据第一个select可以知道:已经把原拉链表的旧数据有效日期根据每日更新数据一一修改了。
所以当前select就是把每日更新数据作为新的有效数据导入拉链表。