需求
1、在会员分析中计算最近七天连续三天活跃会员数。
2、项目的数据采集过程中,有哪些地方能够优化,如何实现?
详解(1)
1、在会员分析中计算最近七天连续三天活跃会员数。
分析:
连续值求解问题,常用四路
-- 1、使用 row_number 在组内给数据编号(rownum)
-- 2、某个值 - rownum = gid,得到结果可以作为后面分组计算的依据
-- 3、根据求得的gid,作为分组条件,求最终结果
本题中,对表dws_member_start_day中的数据使用排名函数row_number()排序,然后根据设备号device_id分组,登录日期 dt 排序,用日期(dt) 减去排名(row_number),得到groupId并限定日期最近7天,根据设备号和groupID分组,求出统计值cnt大于等于3的记录数,即为最近7天中连续3天活跃会员数。
解答过程:
ads层建表
drop table if exists ads.ads_member_continuous_values; create table ads.ads_member_continuous_values ( `cnt` string, ) COMMENT '最近7天连续3天活跃会员数' stored as parquet;
加载ads层数据
#!/bin/bash source /etc/profile if [ -n "$1" ] then do_date=$1 else do_date=`date -d "-1 day" +%F` fi sql=" WITH tmp as( SELECT device_id,dt, date_sub(dt,row_number() over(partition by device_id order by dt)) groupId FROM dws_member_start_day WHERE dt between date_sub(current_date,-7) and current_date), tmp2 as(SELECT device_id,count(1) cnt FROM tmp GROUP BY device_id,groupId having cnt >= 3) insert into table ads.ads_member_continuous_values SELECT count(distinct device_id) total FROM tmp2; " hive -e "$sql"
详解(2)
2、项目的数据采集过程中,有哪些地方能够优化,如何实现?
解答:
-
Flume的双层采集(第一层数据采集,第二层数据汇聚),应对大数据量的情况;
-
Channel可以使用Kafka channel,兼具File Channel和Memory Channel的优点;还可以兼具离线和实时计算;
-
Flume拦截器,可以过滤掉多余的数据,仅保留Json,使解析过程简单些;