对于做数据的小伙伴来说,求最近N天(或者从某个时间点截止到当前)的UV可以说是最常见的场景了,也是数据岗位面试中经常会遇到的问题。第一感觉,可能大部分人都觉得这个问题有什么好说,直接过滤、去重计数就完了呗!但是,当数据量大了,或者说这么简单的问题,怎么在面试中体现自己的水平呢?[/手动狗头/]
好了,言归正传,对于这个问题,常见的策略有以下几种:
1、直接过滤,去重计数。对于小数据量,简单高效的解决问题就是最优解。
SELECT count(distinct user_id) as uv
FROM dwd_log_vst
WHERE
ds > to_char(dateadd(to_date('${cur_date}','yyyymmdd'), - n,'dd'),'yyyymmdd')
2、按照天和人维度去重构建轻度汇总中间表,采用天分区;再进行过滤、去重计数。这样做可以减少扫描的数据量,提升计算效率。
INSERT OVERWRITE TABLE dwd_log_vst_1d (ds='${cur_date}')
SELECT user_id
FROM dwd_log_vst
WHERE ds = '{cur_date}'
GROUP BY user_id
;
SELECT count(distinct user_id) as uv
FROM dwd_log_vst_1d
WHERE ds > to_char(dateadd(to_date('${cur_date}','yyyymmdd&