大数据-232 离线数仓 - 新增会员 需求、创建与加载DWS 层、ADS 层 与 小结
DWS 层通常被称为数据仓库服务层或明细层,它是数据仓库架构中的中间层,负责将原始数据经过清洗、转换后进行存储,并提供给下游的数据应用层或分析层使用。ADS 层是面向应用的数据服务层,主要聚焦于业务的直接需求和决策支持,提供高性能和高响应的数据查询能力,通常是直接为应用或决策系统提供服务。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 执行脚本
新增会员
- 留存会员:某段时间的新增会员,经过一段时间后,仍然使用应用认为是留存的会员。
- 新增会员:第一次使用应用的用户,定义为新增会员,卸载再次安装的设备,不会被算作是新增用户
新增会员先计算 => 计算会员留存
需求描述
每日新增会员数
08-02:DWD,会员每日启动明细(95-110);所有会员信息(1-100)
- 新增会员 101-110
- 新增会员数据+旧的会员的信息 = 新的所有会员信息(1-110)
08-03:DWD,会员每日启动明细(100-120);所有会员的信息(1-110)
- 新增会员:111-120
- 新增会员数据 + 旧的所有会员的信息 = 新的所有会员的信息(1-120)
计算步骤:
- 计算新增会员
- 更新所有会员信息
改进后方法:
- 在所有会员信息中增加时间列,表示这个会员是哪一天成为新增会员
- 只需要一张表:所有会员的信息(id,dt)
- 将新增会员插入所有会员表中
案例:如何计算新增会员
-- t1.dat 的数据如下
4,2020-08-02
5,2020-08-02
6,2020-08-02
7,2020-08-02
8,2020-08-02
9,2020-08-02
-- 日启动表 => DWS
drop table t1;
create table t1(id int, dt string) row format delimited fields terminated by ',';
load data local inpath '/opt/wzk/hive/data/t1.dat' into table t1;
执行如下图所示:
继续执行
-- t2.dat 的数据如下
1,2020-08-01
2,2020-08-01
3,2020-08-01
4,2020-08-01
5,2020-08-01
6,2020-08-01
-- 全量数据 => DWS
drop table t2;
create table t2(id int, dt string)
row format delimited fields terminated by ',';
load data local inpath '/opt/wzk/hive/data/t2.dat' into table t2;
执行结果如下图所示:
继续执行:
-- 找出 2020-08-02 的新用户
select t1.id, t1.dt, t2.id, t2.dt
from t1 left join t2 on t1.id=t2.id
where t1.dt="2020-08-02";
select t1.id, t1.dt
from t1 left join t2 on t1.id=t2.id
where t1.dt="2020-08-02"
and t2.id is null;
继续运行:
-- 将找到 2020-08-02 新用户数据插入t2表中
insert into table t2
select t1.id, t1.dt
from t1 left join t2 on t1.id=t2.id
where t1.dt="2020-08-02"
and t2.id is null;
执行结果如下图所示:
目前t2的数据有:
hive (default)> select * from t2;
OK
t2.id t2.dt
7 2020-08-02
8 2020-08-02
9 2020-08-02
1 2020-08-01
2 2020-08-01
3 2020-08-01
4 2020-08-01
5 2020-08-01
6 2020-08-01
Time taken: 0.137 seconds, Fetched: 9 row(s)
hive (default)>
我们继续加载新的数据进去,整体的思路如下:
-- t3.dat的数据,t1 加载 2020-08-03 的数据
14,2020-08-03
15,2020-08-03
16,2020-08-03
17,2020-08-03
18,2020-08-03
19,2020-08-03
load data local inpath '/opt/wzk/hive/data/t3.dat' into table t1;
-- 同样的思路
-- 将找到 2020-08-03 新用户数据插入t2表中
insert into table t2
select t1.id, t1.dt
from t1 left join t2 on t1.id=t2.id
where t1.dt="2020-08-03"
and t2.id is null;
-- 检查结果
select * from t2;
执行结果如下图所示:
此时t2中的数据有:
hive (default)> select * from t2;
OK
t2.id t2.dt
7 2020-08-02
8 2020-08-02
9 2020-08-02
14 2020-08-03
15 2020-08-03
16 2020-08-03
17 2020-08-03
18 2020-08-03
19 2020-08-03
1 2020-08-01
2 2020-08-01
3 2020-08-01
4 2020-08-01
5 2020-08-01
6 2020-08-01
Time taken: 0.115 seconds, Fetched: 15 row(s)
hive (default)>
DWS作用
统一数据模型
将原始数据(ODS层)按照一定的逻辑模型进行整合、清洗、加工,形成标准化的数据结构。
支持对数据的多维度、多粒度分析。
支持业务场景
满足企业对历史数据的查询和分析需求。
支持 OLAP(在线分析处理)操作,如聚合查询、钻取和切片。
数据细化与分类
将数据按照主题域(如销售、财务、库存等)分类,便于管理和查询。
通常保持较高的细节粒度,便于灵活扩展。
数据准确性与一致性
经过处理的数据经过校验,确保逻辑关系正确,能够为下游提供准确的一致性数据。
创建DWS层表
use dws;
drop table if exists dws.dws_member_add_day;
create table dws.dws_member_add_day
(
`device_id` string,
`uid` string,
`app_v` string,
`os_type` string,
`language` string,
`channel` string,
`area` string,
`brand` string,
`dt` string
) COMMENT '每日新增会员明细'
stored as parquet;
执行结果如下图所示:
加载DWS层数据
我们编写脚本:
vim /opt/wzk/hive/dws_load_member_add_day.sh
写入内容如下:
#!/bin/bash
source /etc/profile
if [ -n "$1" ]
then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
sql="
insert into table dws.dws_member_add_day
select t1.device_id,
t1.uid,
t1.app_v,
t1.os_type,
t1.language,
t1.channel,
t1.area,
t1.brand,
'$do_date'
from dws.dws_member_start_day t1 left join
dws.dws_member_add_day t2
on t1.device_id=t2.device_id
where t1.dt='$do_date'
and t2.device_id is null;
"
hive -e "$sql"
写入的内容如下图所示:
ADS 作用
聚合和简化数据
将 DWS 层中多表、多主题域的数据聚合成简单易用的表或视图。
直接输出满足业务需求的数据结果。
面向业务应用
通过设计宽表或高性能视图,直接支持具体的业务场景和报表需求。
响应快速查询需求,如实时数据的展示。
数据分发与集成
为前端的 BI 工具、报表系统或 API 服务提供高效的查询接口。
能够通过缓存机制或物化视图加速查询性能。
轻量化与高性能
尽量减少数据量,保留业务最关心的关键指标。
采用预聚合、预计算等技术提升查询效率。
创建ADS层表
drop table if exists ads.ads_new_member_cnt;
create table ads.ads_new_member_cnt(
`cnt` string
)
partitioned by(dt string)
row format delimited fields terminated by ',';
执行结果如下图所示:
加载ADS层数据
编写数据加载的脚本:
vim /opt/wzk/hive/ads_load_member_add.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_new_member_cnt
partition (dt='$do_date')
select count(1)
from dws.dws_member_add_day
where dt = '$do_date'
"
hive -e "$sql"
暂时小结
调用脚本的次序是:
dws_load_member_add_day.sh
ads_load_member_add.sh
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)