拉链表

2019-11-27  本文已影响0人  大道至简_6a43

我们知道在hive中如果大量更改某个字段的值是不容易实现的,所以在拉链表中就否决了这一做法,那具体怎样做呢,就是再生成一张新的表覆盖原来的表。

拉链表的基本流程

三张表

1 . 订单表

2 . 旧的拉链表

3. 临时拉链表

第一步:

将新的订单变化表,后面加上开始结束日期字段追加到临时拉链表的后面,具体操作是,通过时间限制,将新的数据过滤出来,在其后面添加字段然后追加到新的拉链表后面。

第二步:

通过新的订单表与旧的拉链表的结合操作,更改旧的拉链表的结束时间

具体方法是:

旧的拉链left join 新的订单表,如果left join后判断新的订单表的ID为空说明这个新的订单ID是第一次出现,

也就不用更新结束时间,如果不为空说明该订单之前已经出现,这次出现说明状态有了新的改变,需要更改上次

订单的状态结束时间。具体可以使用if( = , a , b) end_time

核心代码:大家可以模仿这个来实现

insertoverwrite table dwd_order_info_his_tmp

select* from

(

select

id,

 total_amount,

 order_status,

user_id,

payment_way,

out_trade_no,

create_time,

operate_time,

'2019-02-14' start_date,

 '9999-99-99' end_date

fromdwd_order_infowhere dt='2019-02-14'

unionall

selectoh.id,

oh.total_amount,

oh.order_status,

oh.user_id,

oh.payment_way,

oh.out_trade_no,

oh.create_time,

oh.operate_time,

oh.start_date,

if(oi.id is null, oh.end_date, date_add(oi.dt,-1)) end_date

fromdwd_order_info_hisohleft

join

(

select

*

fromdwd_order_info

where dt='2019-02-14'

) oi

onoh.id=oi.id and oh.end_date='9999-99-99'

)his

orderby his.id, start_date;

上一篇 下一篇

猜你喜欢

热点阅读