数据仓库 用户新增主题

实现思路:要知道今天有哪些用户是新增用户,需要知道两件事,一是今天所有的活跃用户,因此,新增用户的数据来源,还是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 '	'
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写成脚本,略。

原文地址:https://www.cnblogs.com/noyouth/p/13196403.html