码迷,mamicode.com
首页 > 其他好文 > 详细

数据仓库 用户活跃主题

时间:2020-06-26 20:38:13      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:color   lan   form   format   赋值   ios   服务层   tail   版本号   

①对某一主题的分析,涉及到DWS数据服务层和ADS数据应用层。

②业务术语

用户:用户以设备为判断标准,在移动统计中,每个独立设备认为是一个独立用户。Android系统根据IMEI号,IOS系统根据OpenUDID来标识一个独立用户,每部手机一个用户。

活跃用户:打开应用的用户即为活跃用户,不考虑用户的使用情况。每天一台设备打开多次会被计一个活跃用户。

 

周(月活跃用户):某个自然周(启动过应用的用户,该周(的多次启动只记一个活跃用户。

③用户活跃的数据来源于启动日志,具体来说,是DWD数据明细层的启动日志表数据。

 

一 每日活跃设备明细

建表语句。

分析:

①最重要的就是设备id,日活的标志。

②因为是日活表,需按照日期(年月日)进行分区。

 

drop table if exists dws_uv_detail_day;
create external table dws_uv_detail_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 纬度
)
partitioned by(dt string)
stored as parquet
location /warehouse/gmall/dws/dws_uv_detail_day
;

 

导入数据。

分析:

①日活表的数据来源于启动日志表,存在一个设备每天有多条的情况,需要按照设备id去重。

②与mysql语法不通,在hive语句中,非group by的字段必须放在聚合函数里。

③数据来源于DWD层的启动日志表dwd_start_log。

insert overwrite table dws_uv_detail_day 
partition(dt=2019-02-10)
select  
    mid_id,
    concat_ws(|, collect_set(user_id)) user_id,
    concat_ws(|, collect_set(version_code)) version_code,
    concat_ws(|, collect_set(version_name)) version_name,
    concat_ws(|, collect_set(lang))lang,
    concat_ws(|, collect_set(source)) source,
    concat_ws(|, collect_set(os)) os,
    concat_ws(|, collect_set(area)) area, 
    concat_ws(|, collect_set(model)) model,
    concat_ws(|, collect_set(brand)) brand,
    concat_ws(|, collect_set(sdk_version)) sdk_version,
    concat_ws(|, collect_set(gmail)) gmail,
    concat_ws(|, collect_set(height_width)) height_width,
    concat_ws(|, collect_set(app_time)) app_time,
    concat_ws(|, collect_set(network)) network,
    concat_ws(|, collect_set(lng)) lng,
    concat_ws(|, collect_set(lat)) lat
from dwd_start_log
where dt=2019-02-10
group by mid_id;

 

二 每周活跃设备明细

建表语句

分析:

①字段与日活表相比,增加了每周的开头结尾,即周一和周日的日期,方便后续的展示。

②分区设置为每周的周一和周日的日期。

drop table if exists dws_uv_detail_wk;
create external table dws_uv_detail_wk( 
    `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 纬度,
    `monday_date` string COMMENT 周一日期,
    `sunday_date` string COMMENT  周日日期 
) COMMENT 活跃用户按周明细
PARTITIONED BY (`wk_dt` string)
stored as parquet
location /warehouse/gmall/dws/dws_uv_detail_wk/
;

导入数据

分析:

①周活的数据,不是直接来源于DWD层,而是来源于和自己同在DWS层的日活表,日活表已经对启动日志进行了日内去重,数据量更小。周活表需要对日活表进行周内去重。

②因为分区的格式比较复杂,难以事先给定,需要计算后,放在最后一个字段,以给分区赋值。所以开启了非严格模式,进行动态分区。

③在对本周周日的计算上。先算下个星期一,因为这个星期一必定在下周,所以减1就是本周周日。

④where条件限定了只有在本周区间内的记录才会被插入进这个分区。

set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table dws_uv_detail_wk partition(wk_dt)
select  
    mid_id,
    concat_ws(|, collect_set(user_id)) user_id,
    concat_ws(|, collect_set(version_code)) version_code,
    concat_ws(|, collect_set(version_name)) version_name,
    concat_ws(|, collect_set(lang)) lang,
    concat_ws(|, collect_set(source)) source,
    concat_ws(|, collect_set(os)) os,
    concat_ws(|, collect_set(area)) area, 
    concat_ws(|, collect_set(model)) model,
    concat_ws(|, collect_set(brand)) brand,
    concat_ws(|, collect_set(sdk_version)) sdk_version,
    concat_ws(|, collect_set(gmail)) gmail,
    concat_ws(|, collect_set(height_width)) height_width,
    concat_ws(|, collect_set(app_time)) app_time,
    concat_ws(|, collect_set(network)) network,
    concat_ws(|, collect_set(lng)) lng,
    concat_ws(|, collect_set(lat)) lat,
    date_add(next_day(2019-02-10,MO),-7),
    date_add(next_day(2019-02-10,MO),-1),
    concat(date_add( next_day(2019-02-10,MO),-7), _ , date_add(next_day(2019-02-10,MO),-1) 
)
from dws_uv_detail_day 
where dt>=date_add(next_day(2019-02-10,MO),-7) and dt<=date_add(next_day(2019-02-10,MO),-1) 
group by mid_id;

 

三 每月活跃设备明细

建表语句

分析:

与日活表的字段完全一样,只是需要根据月份来分区。

drop table if exists dws_uv_detail_mn;

create external table dws_uv_detail_mn( 
    `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 纬度
) COMMENT 活跃用户按月明细
PARTITIONED BY (`mn` string)
stored as parquet
location /warehouse/gmall/dws/dws_uv_detail_mn/
;

导入数据

set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table dws_uv_detail_mn partition(mn)
select  
    mid_id,
    concat_ws(|, collect_set(user_id)) user_id,
    concat_ws(|, collect_set(version_code)) version_code,
    concat_ws(|, collect_set(version_name)) version_name,
    concat_ws(|, collect_set(lang)) lang,
    concat_ws(|, collect_set(source)) source,
    concat_ws(|, collect_set(os)) os,
    concat_ws(|, collect_set(area)) area, 
    concat_ws(|, collect_set(model)) model,
    concat_ws(|, collect_set(brand)) brand,
    concat_ws(|, collect_set(sdk_version)) sdk_version,
    concat_ws(|, collect_set(gmail)) gmail,
    concat_ws(|, collect_set(height_width)) height_width,
    concat_ws(|, collect_set(app_time)) app_time,
    concat_ws(|, collect_set(network)) network,
    concat_ws(|, collect_set(lng)) lng,
    concat_ws(|, collect_set(lat)) lat,
    date_format(2019-02-10,yyyy-MM)
from dws_uv_detail_day
where date_format(dt,yyyy-MM) = date_format(2019-02-10,yyyy-MM)
group by mid_id;

 

最后,需要将导入数据的部分做成灵活的脚本,略。

 

 

 

 

 

 

 

数据仓库 用户活跃主题

标签:color   lan   form   format   赋值   ios   服务层   tail   版本号   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!