数据仓库 用户活跃主题
Posted noyouth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据仓库 用户活跃主题相关的知识,希望对你有一定的参考价值。
①对某一主题的分析,涉及到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;
最后,需要将导入数据的部分做成灵活的脚本,略。
以上是关于数据仓库 用户活跃主题的主要内容,如果未能解决你的问题,请参考以下文章