实现思路:要知道今天有哪些用户是新增用户,需要知道两件事,一是今天所有的活跃用户,因此,新增用户的数据来源,还是DWS层的设备日活表,新增用户,就是部分日活的用户。二是要知道哪些用户在以前活跃过,用今日活跃用户减去以前活跃过的用户,剩下的就是新增用户。
DWS层(每日新增设备明细表)
建表语句。
分析:这个表用来存储每日新增的设备(用户),数据量比起每日活跃表来说,要少的多。因为一台设备可以在每天都生成活跃记录,而新增设备却只会出现一条记录,数据量相对较少,可以不用分区表。
drop table if exists dws_new_mid_day; create external table dws_new_mid_day ( `mid_id` string COMMENT '设备唯一标识', `user_id` string COMMENT '用户标识', `version_code` string COMMENT '程序版本号', `version_name` string COMMENT '程序版本名', `lang` string COMMENT '系统语言', `source` string COMMENT '渠道号', `os` string COMMENT '安卓系统版本', `area` string COMMENT '区域', `model` string COMMENT '手机型号', `brand` string COMMENT '手机品牌', `sdk_version` string COMMENT 'sdkVersion', `gmail` string COMMENT 'gmail', `height_width` string COMMENT '屏幕宽高', `app_time` string COMMENT '客户端日志产生时的时间', `network` string COMMENT '网络模式', `lng` string COMMENT '经度', `lat` string COMMENT '纬度', `create_date` string comment '创建时间' ) COMMENT '每日新增设备信息' stored as parquet location '/warehouse/gmall/dws/dws_new_mid_day/';
数据导入,以2019-02-10为例。用日活表取连接新增设备表,如果以前没有出现在新增设备中的数据(nm.mid_id is null),即为新增的设备。
insert into table dws_new_mid_day select ud.mid_id, ud.user_id , ud.version_code , ud.version_name , ud.lang , ud.source, ud.os, ud.area, ud.model, ud.brand, ud.sdk_version, ud.gmail, ud.height_width, ud.app_time, ud.network, ud.lng, ud.lat, '2019-02-10' from dws_uv_detail_day ud left join dws_new_mid_day nm on ud.mid_id=nm.mid_id where ud.dt='2019-02-10' and nm.mid_id is null;
ADS层(每日新增设备表)
上面的新增设备明细表,只是记录了每日新增了哪些设备,但报表上要展示的,是每日新增了多少数量的设备,因此,还需要一个ADS层的表去存储count后的数据,以便于直接展示在报表里。
建表语句。
drop table if exists ads_new_mid_count; create external table ads_new_mid_count ( `create_date` string comment '创建时间' , `new_mid_count` BIGINT comment '新增设备数量' ) COMMENT '每日新增设备信息数量' row format delimited fields terminated by '\t' location '/warehouse/gmall/ads/ads_new_mid_count/';
导入数据,以2019-02-10为例。
insert into table ads_new_mid_count select create_date, count(*) from dws_new_mid_day where create_date='2019-02-10' group by create_date;
最后,还要将上面的两个导数据的sql写成脚本,略。