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就是把每日更新数据作为新的有效数据导入拉链表。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值