我们知道在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;
网友评论