hive拉链表

287 阅读1分钟

拉链表

  1. hive中的拉链表A数据如下

       userId     addr      starttime    endtime
       008        gz        2021-01-01   9999-12-31
    
  2. 增量进入数据表B数据如下

        userId    addr      starttime    endtime
        008       sh        2021-01-02   9999-12-31
        011       jx        2021-01-02   9999-12-31
        012       zj        2021-01-02   9999-12-31
    
  3. A表left join B表关联 --C

      userId     addr       starttime    endtime
      008        sh        2021-01-02   2021-01-01
      011        jx        2021-01-02   2021-01-01
      012        zj        2021-01-02   2021-01-01
      
      
     select
      a.userid,
      a.phone,
      a.nick,
      a.gender,
      a.addr,
      a.starttime,
      --如果这条数据没有更新或者这条数据不是要更改的数据,就保留原来的值,否则就改为新数据的开始时间-1
      if(b.userid is null or a.endtime < '9999-12-31', a.endtime , date_sub(b.starttime,1)) as endtime
    from dw_zipper a  left join ods_zipper_update b
    on a.userid = b.userid ;
    
  4. A表union all C -->新的链表

    userId     addr       starttime    endtime
    008        gz        2021-01-01   9999-12-31
    008        sh        2021-01-02   2021-01-01
    011        jx        2021-01-02   2021-01-01
    012        zj        2021-01-02   2021-01-01