hive 数据仓库之拉链表

先去看这篇文章:https://www.cnblogs.com/lxbmaomao/p/9821128.html

然后重点是这部分(从文章开头看到下面我截图这部分就行):

首先,下面的user表没有用到。。而且貌似也没有用,文章中为什么要user表我也搞不懂。。明明user的拉链表可以就包含了user全量表的数据了。。

由于hdfs和hive的底层因素,不支持修改操作。所以修改数据只能先把数据查询出来,修改完后再覆盖原本的数据。

我对上述insert sql的理解:

先查询拉链表的数据,修改相关数据为旧的历史记录,把每日更新表数据作为新的历史记录。然后把结果覆盖回拉链表。

UNION联合的两个select的理解:

1、第一个select:

  1. SELECT A.user_num, 
  2.            A.mobile, 
  3.            A.reg_date, 
  4.            A.t_start_time, 
  5.            CASE 
  6.                 WHEN A.t_end_time = '9999-12-31' AND B.user_num IS NOT NULL THEN '2017-01-01' 
  7.                 ELSE A.t_end_time 
  8.            END AS t_end_time 
  9.     FROM dws.user_his  A 
  10.     LEFT JOIN ods.user_update  B 
  11.     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

  1. SELECT C.user_num, 
  2.            C.mobile, 
  3.            C.reg_date, 
  4.            '2017-01-02' AS t_start_time, 
  5.            '9999-12-31' AS t_end_time 
  6.     FROM ods.user_update AS C 

根据第一个select可以知道:已经把原拉链表的旧数据有效日期根据每日更新数据一一修改了。

所以当前select就是把每日更新数据作为新的有效数据导入拉链表。

发布了144 篇原创文章 · 获赞 36 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_36951116/article/details/104099778