首日的时候因为是全量的数据从maxwell过来的时候数据的类型是bootstrap-insert的数据,然后根据维度id得到加购的事务事实表,然后更具创建的时间进行动态分区。
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_cart_add_inc partition (dt)
select
id,
user_id,
sku_id,
date_format(create_time,'yyyy-MM-dd') date_id,
create_time,
source_id,
source_type,
dic.dic_name,
sku_num,
date_format(create_time, 'yyyy-MM-dd')
from
(
select
data.id,
data.user_id,
data.sku_id,
data.create_time,
data.source_id,
data.source_type,
data.sku_num
from ods_cart_info_inc
where dt = '2020-06-14'
and type = 'bootstrap-insert'
)ci
left join
(
select
dic_code,
dic_name
from ods_base_dic_full
where dt='2020-06-14'
and parent_code='24'
)dic
on ci.source_type=dic.dic_code;
然后是每日的增量处理maxwell的insert和update的操作,因为计算的是加购的业务,所以是update的时候只记录比之前加购次数多的信息
insert overwrite table dwd_trade_cart_add_inc partition(dt='2020-06-15')
select
id,
user_id,
sku_id,
date_id,
create_time,
source_id,
source_type_code,
source_type_name,
sku_num
from
(
select
data.id,
data.user_id,
data.sku_id,
date_format(from_utc_timestamp(ts*1000,'GMT+8'),'yyyy-MM-dd') date_id,
date_format(from_utc_timestamp(ts*1000,'GMT+8'),'yyyy-MM-dd HH:mm:ss') create_time,
data.source_id,
data.source_type source_type_code,
if(type='insert',data.sku_num,data.sku_num-old['sku_num']) sku_num
from ods_cart_info_inc
where dt='2020-06-15'
and (type='insert'
or(type='update' and old['sku_num'] is not null and data.sku_num>cast(old['sku_num'] as int)))
)cart
left join
(
select
dic_code,
dic_name source_type_name
from ods_base_dic_full
where dt='2020-06-15'
and parent_code='24'
)dic
on cart.source_type_code=dic.dic_code;
注意的点
- 首日的时候由于没有记录加购的过程都是bootstrap-insert,那么就直接用原来的加购次数为初始的次数
- 每日的时候,由于有insert和update如果是insert那么就是直接的加入,如果是update那么要满足type='update' and old['sku_num'] is not null and data.sku_num>cast(old['sku_num'] as int 获取数据的时候if(type='insert',data.sku_num,data.sku_num-old['sku_num'])
- 时间处理的时候,由于有update操作所以记录的createtime是maxwell里面的时间搓的时间
-
date_format(from_utc_timestamp(ts*1000,'GMT+8'),'yyyy-MM-dd HH:mm:ss') 时间搓秒的装换方法