0. 相关文章链接
1. 为什么要获取最新的数据
当为应用后台提供数据协助时(比如通过近段时间的数据用了计算用户特征时),在大数据是计算所有的有行为的用户,但是这些用户的特征不是都有变化,这时传送给应用后台的数据只需要传输有变化和新增的即可,并使用根据主键更新的模式传输数据,这样能减少数据的传输。
2. 怎么获取最新的数据
一般这种情况下,在大数据数仓中这样的表必须要设置成分区表,然后今天的数据和昨天的数据存储在不同分区中,再添加一个脚本对比这2个分区的数据,求出新增的和变化的。
主要知识点为使用 distinct 求出变化的,要在今天的分区中有数据而昨天的分区中没数据求出新增的,具体脚本如下:
drop table if exists temp_dtl_increment_new_user_feature;
create table temp_dtl_increment_new_user_feature as
-- 算出更改的(使用distinct对需要获取的字段去重,这样获取的数据都不一样的,然后对用户id进行聚合,当同一个用户id存在2条数据,即该用户的特征有更改)
select
user_id
from(
select
distinct user_id,
user_belong
from
yishou_daily.dtl_new_user_feature
where
dt
between
to_char( dateadd( to_date1(${bdp.system.bizdate}, 'yyyymmdd'), -1, 'dd' ), 'yyyymmdd' )
and
${bdp.system.bizdate}
)
group by
user_id
having
count(*) > 1
union
-- 算出新增的(在今天的分区中有数据而昨天的分区中没数据,即是新增的)
select
a.user_id
from
(
select
user_id
from
yishou_daily.dtl_new_user_feature
where
dt = ${bdp.system.bizdate}
) a
left join (
select
user_id
from
yishou_daily.dtl_new_user_feature
where dt = to_char( dateadd( to_date1(${bdp.system.bizdate}, 'yyyymmdd'), -1, 'dd' ), 'yyyymmdd' )
) b on a.user_id = b.user_id
where
b.user_id is null;
-- 使用特征表里面的新的分区,内连接上述求出的新增的和更改的用户表,可以求出对应的用户的特征
select
a.user_id,
user_belong
from yishou_daily.dtl_new_user_feature a
inner join temp_dtl_increment_new_user_feature b
on a.user_id = b.user_id
where
a.dt = ${bdp.system.bizdate};
注:其他相关文章链接由此进 -> 开发随笔文章汇总