当前位置: 首页 > article >正文

大数据-233 离线数仓 - 留存会员 需求、创建与加载DWS 层、ADS 层 与 小结

点一下关注吧!!!非常感谢!!持续更新!!!

Java篇开始了!

目前开始更新 MyBatis,一起深入浅出!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(已更完)
  • Prometheus(已更完)
  • Grafana(已更完)
  • 离线数仓(正在更新…)

章节内容

上节我们完成了如下的内容(新增会员模块):

  • DWS 层
  • ADS 层
  • 创建 Hive 执行脚本

在这里插入图片描述

留存会员

  • 留存会员与留存率:某段时间的新增会员,经过一段时间后,仍继续使用应用认为是留存会员,这部分会员占当时新增会员的比例为留存率。
  • 需求:1日、2日、3日的会员留存率和会员留存率

在这里插入图片描述

  • 10W新会员:dws_member_add_day(dt=08-01)明细
  • 3w:特点是1号是新会员,在2日启动了(2日的启动日志)dws_member_start_day

DWS 的作用

统一数据模型

将原始数据(ODS层)按照一定的逻辑模型进行整合、清洗、加工,形成标准化的数据结构。
支持对数据的多维度、多粒度分析。

支持业务场景

满足企业对历史数据的查询和分析需求。
支持 OLAP(在线分析处理)操作,如聚合查询、钻取和切片。

数据细化与分类

将数据按照主题域(如销售、财务、库存等)分类,便于管理和查询。
通常保持较高的细节粒度,便于灵活扩展。

数据准确性与一致性

经过处理的数据经过校验,确保逻辑关系正确,能够为下游提供准确的一致性数据。

创建DWS层表

-- 会员留存明细
drop table if exists dws.dws_member_retention_day;
create table dws.dws_member_retention_day
(
  `device_id` string,
  `uid` string,
  `app_v` string,
  `os_type` string,
  `language` string,
  `channel` string,
  `area` string,
  `brand` string,
  `add_date` string comment '会员新增时间',
  `retention_date` int comment '留存天数'
)COMMENT '每日会员留存明细'
PARTITIONED BY (`dt` string)
stored as parquet;

执行结果如下图所示:
在这里插入图片描述

加载DWS层数据

vim /opt/wzk/hive/dws_load_member_retention_day.sh

写入的内容如下所示:

#!/bin/bash
source /etc/profile
if [ -n "$1" ] ;then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
sql="
drop table if exists tmp.tmp_member_retention;
create table tmp.tmp_member_retention as
(
  select t2.device_id,
  t2.uid,
  t2.app_v,
  t2.os_type,
  t2.language,
  t2.channel,
  t2.area,
  t2.brand,
  t2.dt add_date,
  1
  from dws.dws_member_start_day t1 join dws.dws_member_add_day
  t2 on t1.device_id=t2.device_id
  where t2.dt=date_add('$do_date', -1)
  and t1.dt='$do_date'
  union all
  select t2.device_id,
  t2.uid,
  t2.app_v,
  t2.os_type,
  t2.language,
  t2.channel,
  t2.area,
  t2.brand,
  t2.dt add_date,
  2
  from dws.dws_member_start_day t1 join dws.dws_member_add_day
  t2 on t1.device_id=t2.device_id
  where t2.dt=date_add('$do_date', -2)
  and t1.dt='$do_date'
  union all
  select t2.device_id,
  t2.uid,
  t2.app_v,
  t2.os_type,
  t2.language,
  t2.channel,
  t2.area,
  t2.brand,
  t2.dt add_date,
  3
  from dws.dws_member_start_day t1 join dws.dws_member_add_day
  t2 on t1.device_id=t2.device_id
  where t2.dt=date_add('$do_date', -3)
  and t1.dt='$do_date'
);
insert overwrite table dws.dws_member_retention_day
partition(dt='$do_date')
select * from tmp.tmp_member_retention;
"
hive -e "$sql"

写入的内容如下所示:
在这里插入图片描述

ADS 作用

聚合和简化数据

将 DWS 层中多表、多主题域的数据聚合成简单易用的表或视图。
直接输出满足业务需求的数据结果。

面向业务应用

通过设计宽表或高性能视图,直接支持具体的业务场景和报表需求。
响应快速查询需求,如实时数据的展示。

数据分发与集成

为前端的 BI 工具、报表系统或 API 服务提供高效的查询接口。
能够通过缓存机制或物化视图加速查询性能。

轻量化与高性能

尽量减少数据量,保留业务最关心的关键指标。
采用预聚合、预计算等技术提升查询效率。

创建ADS层表

-- 会员留存数
drop table if exists ads.ads_member_retention_count;
create table ads.ads_member_retention_count
(
  `add_date` string comment '新增日期',
  `retention_day` int comment '截止当前日期留存天数',
  `retention_count` bigint comment '留存数'
) COMMENT '会员留存数'
partitioned by(dt string)
row format delimited fields terminated by ',';

-- 会员留存率
drop table if exists ads.ads_member_retention_rate;
create table ads.ads_member_retention_rate
(
  `add_date` string comment '新增日期',
  `retention_day` int comment '截止当前日期留存天数',
  `retention_count` bigint comment '留存数',
  `new_mid_count` bigint comment '当日会员新增数',
  `retention_ratio` decimal(10,2) comment '留存率'
) COMMENT '会员留存率'
partitioned by(dt string)
row format delimited fields terminated by ',';

执行结果如下图所示:
在这里插入图片描述

加载ADS层数据

vim /opt/wzk/hive/ads_load_member_retention.sh

写入的内容如下所示:

#!/bin/bash
source /etc/profile
if [ -n "$1" ] ;then
  do_date=$1
else
  do_date=`date -d "-1 day" +%F`
  fi
  sql="
insert overwrite table ads.ads_member_retention_count
partition (dt='$do_date')
select add_date, retention_date,
count(*) retention_count
from dws.dws_member_retention_day
where dt='$do_date'
group by add_date, retention_date;
insert overwrite table ads.ads_member_retention_rate
partition (dt='$do_date')
select t1.add_date,
t1.retention_day,
t1.retention_count,
t2.cnt,
t1.retention_count/t2.cnt*100
from ads.ads_member_retention_count t1 join
ads.ads_new_member_cnt t2 on t1.dt=t2.dt
where t1.dt='$do_date';
"
hive -e "$sql"

备注:最后一条SQL的连线条件应该为:t1.add_date=t2.dt。
写入的内容如下所示:
在这里插入图片描述

暂时小结

到此,我们的数仓基本上构建完毕,后续将数据导入进行详细的处理。
在这里插入图片描述
离线数仓(Data Warehouse)通常分为多个层次,以便更好地组织数据。其中,DWS(Data Warehouse Service)和 ADS(Application Data Service)是数据仓库中两个重要的逻辑层级,分别承担不同的功能。

  • DWS:是数仓的核心层,旨在加工、汇总和提供高复用的数据服务。
  • ADS:是数仓的应用层,专注于满足特定业务场景的需求。

WS(Data Warehouse Service)——服务层或中间层
定义:DWS 通常是离线数仓中的汇总层或服务层,主要对数据进行整理、加工和聚合,为上层的数据分析或应用提供服务。

ADS(Application Data Service)——应用层
定义:ADS 是数仓中的应用层,通常是直接面向业务需求,提供特定场景下所需的分析结果或服务。

DWS 与 ADS 的关系

  • DWS 是 ADS 的上游:DWS 提供的标准化、可复用的数据服务是 ADS 构建的基础。
  • 功能定位不同:DWS 更偏向数据整合与标准化,而 ADS 更关注业务需求的个性化满足。
  • 数据粒度:DWS 的数据粒度更细,ADS 通常是基于 DWS 的聚合和过滤,面向特定需求输出。

http://www.kler.cn/a/410293.html

相关文章:

  • 《硬件架构的艺术》笔记(五):低功耗设计
  • GoF设计模式——结构型设计模式分析与应用
  • JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
  • Linux线程(Linux和Windows的线程区别、Linux的线程函数、互斥、同步)
  • 使用ChatGPT生成和优化电子商务用户需求规格说明书
  • 2025-2026财年美国CISA国际战略规划(下)
  • 【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法
  • 软件工程第13章小测
  • 【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
  • Docker 的存储驱动及其优缺点
  • 超高流量多级缓存架构设计!
  • 配置Springboot+vue项目在ubuntu20.04
  • Vue实训---1-创建Vue3项目
  • docker离线安装linux部分问题整理
  • 电话机器人的未来发展前景,未来发展趋势怎么样?
  • ThingsBoard规则链节点:Azure IoT Hub 节点详解
  • ubuntu 安装 conda
  • ajax基础
  • 使用 Java 操作 SQLite 数据库
  • Spring Boot 应用开发:构建高效、可扩展的 Java 微服务
  • 基于springboot + vue-element-plus-admin开发的MES系统源码,制造执法系统MES源码;支持app,小程序,H5,后台
  • (72)采用格雷(Gray)编码的8-PSK调制解调通信系统的MATLAB仿真
  • Solon 拉取 maven 包很慢或拉不了,怎么办?
  • javaEE初阶——多线程(1)
  • GitLab|应用部署
  • 【强化学习的数学原理】第05课-蒙特卡洛方法-笔记