1.数仓分层概述
数据仓库分为三层,自下而上为:
数据引入层(ODS,Operation Data Store)
数据公共层(CDM,Common Data Model)
数据应用层(ADS,Application Data Service)
- 数据引入层(ODS,Operation Data Store):将原始数据几乎无处理的存放在数据仓库系统,结构上与源系统基本保持一致,是数据仓库的数据准备区。
- 数据公共层(CDM,Common Data Model,又称通用数据模型层),包含DIM维度表、DWD和 DWS,由ODS层数据加工而成。主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标。这一层里又包括三层:
1.公共维度层(DIM):全拼dimension
,基于维度建模理念思想,建立整个企业的一致性维度。降低数据计算口径和算法不统一风险。公共维度层的表通常也被称为逻辑维度表,维度和维度逻辑表通常一一对应。
2.数仓明细层(DWD):全拼data warehouse detail
大体作用:ods经过清洗,落地这一层,一般是最细粒度。
具体:以业务过程作为建模驱动,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,也即宽表化处理。明细粒度事实层的表通常也被称为逻辑事实表。
3.数据汇总层(DWS):全拼data warehouse service
大体作用:对dwd的轻微聚合,对一些可累加的指标进行聚合,增加复用性
具体:以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段物理化模型。构建命名规范、口径一致的统计指标,为上层提供公共指标,建立汇总宽表、明细事实表。公共汇总粒度事实层的表通常也被称为汇总逻辑表,用于存放派生指标数据。 - 数据应用层(ADS,Application Data Service):存放数据产品个性化的统计指标数据。根据CDM与ODS层加工生成
2.数仓开发规范
2.1 数据库命名
命名规则:数仓对应分层_{业务线|业务项目}
命名示例:ods_nshop/dwd_nshop/dws_nshop/dim_nshop/ads_nshop/
2.2 数仓各层对应数据库
ods/sda层 -> sda/ods_{业务线|业务项目}(原始数据)
dw层 -> dwd_{业务线|业务项目} (主题) + dws_{业务线|业务项目}(基于主题宽表汇总)
dim层 -> dim_维度 (维表库)
ads层 -> ads_{业务线|业务项目} (应用统计指标等)
middle层 -> mid_{业务线|业务项目}(中间库) 临时数据 -> temp_{业务线|业务项目}(临时库)
2.3 数据库表命名规则
- 原始数据层
命名规则:
ods_{业务线|业务项目}_{数据来源类型}_{业务}
ods_{业务线|业务项目}_{数据来源类型}_{业务}_{时间粒度}_delta
delta代表增量,主要用于数据同步方向产生的原始数据表
命名示例:
ods_nshop_01_useractlog XX用户日志原始数据表
ods_nshop_02_user XX用户表(全量)
ods_nshop_02_user_delta XX用户表(增量)
ods_nshop_02_user_hh_delta XX用户表(小时级增量 dd天) - 主题/事实数据层
命名规则:
dwd_{业务线|业务项目}_{主题域}_{子业务}
命名示例:
dwd_nshop_user_logproview XX用户产品浏览日志事实表
dwd_nshop_user_comment XX用户关注事实表 - 主题/事实汇总层
命名规则:
dws_{业务线|业务项目}_{主题域}_{汇总相关粒度}_{汇总时间周期}
命名示例:
dws_nshop_user_order_nd XX用户订单汇总N天统计表
dws_nshop_user_cmtpro_nd XX用户产品关注汇总N天统计表 - 维表层
命名规则:
dim_{业务线|业务项目|pub公共}_{维度}
命名示例:
dim_pub_date 时间维表
dim_pub_area 地区维表
dim_pub_category 商品分类 - 集市层
命名规则:ads_{业务线|业务项目}_{统计业务}_{报表form|热门排序topN}
命名示例:
ads_nshop_order_form 订单统计表 ads_nshop_orderpay_form 订单支付统计 - 数据来源说明
01 -> hdfs数据 ods_nshop.ods_01_action_log 行为日志表
02 -> mysql数据 ods_nshop.ods_02_user 用户表
03 -> redis数据
04 -> mongodb数据
05 -> tidb数据
3.数据来源介绍
3.1 业务数据
业务数据往往产生于事务型过程处理,所以一般存储在关系型数据库中,如mysql、oracle
业务数据源: 用户基本信息、商品分类信息、商品信息、店铺信息、订单数据、订单支付信息、活动信息、物流信息等
3.2 埋点日志
埋点日志相对业务数据是用于数据分析、挖掘需求,一般以日志形式存储于日志文件中,随后通过采集落地 分布式存储介质中如hdfs、hbase
用户行为日志: 用户浏览、用户点评、用户关注、用户搜索、用户投诉、用户咨询
3.3 外部数据
当前一般公司都会通过线上广告来进行获客,与三方公司合作更多的提取相关数据来进行深度刻画用户及用 户群体,另外爬取公共公开数据也是分析运营的常用方式。
外部数据源: 广告投放数据、爬虫数据、三方接口数据
4.数仓建设
4.1 ODS贴源层
1.ODS层存放您从业务系统获取的最原始的数据,是其他上层数据的源数据。
2.ODS层数据主要包括:用户基本信息、商品分类信息、商品信息、店铺信息、 订单数据、订单支付信息、活动信息、行为日志信息
- MySQL业务数据对应Hive表
中文含义 | MYSQL表名 | HIVE表名 |
---|---|---|
用户基本信息表 | nshop.customer | ods_nshop.ods_nshop_02_customer |
用户关注表 | nshop.customer_attention | ods_nshop.ods_nshop_02_customer_attention |
收货地址管理表 | nshop.customer_consignee | ods_nshop.ods_nshop_02_customer_consignee |
订单表 | nshop.orders | ods_nshop.ods_nshop_02_orders |
订单详情表 | nshop.order_detail | ods_nshop.ods_nshop_02_order_detail |
订单支付记录表 | nshop.orders_pay_records | ods_nshop.ods_nshop_02_orders_pay_records |
- 埋点日志对应Hive表
中文含义 | HIVE表名 |
---|---|
用户行为日志表 | ods_nshop.ods_nshop_01_useractlog |
电商平台在网页版或APP版终端上进行业务埋点,采集相关用户行为数据发送给服务器进行用户行为分析。
- 外部数据对应Hive表
中文含义 | HIVE表名 |
---|---|
广告投放信息表 | ods_nshop.ods_nshop_01_releasedatas |
外部数据来源主要有:
1 企业间的接口调用(如其他企业平台上的广告投放营销)
2 公共数据的爬虫数据(公共数据、友商数据、社区|社交平台公开数据)
4.2 DW主题层
主题划分
在不同的业务中,数仓建设都会涉及到几种类型的数据:通用行为数据、业务强相关的数据、通用行为衍生出的行为数据以及其它不易划分的数据:
1 通用行为数据主题: 即各业务场景都容易出现行为,比如用户行为日志中的曝光、点击和下载等。
2 业务行为数据主题: 主要是指和业务强相关的行为,比如说电商下单业务,视频业务中有播放行为。
3 衍生行为数据主题: 主要是指非用户原始的行为,比如说留存,本身是由用户活跃来描述的。
4 其它行为数据主题: 有一些多主题交叉的数据,比如跨业务和行为的阅读带来的购买行为数据主题
电商项目中所涉及的主题包括:
【用户主题】-> 衍生行为数据主题(更多的)
【交易主题】-> 业务行为数据主题
【营销活动主题】-> 业务行为数据主题
【事件(行为日志)主题】-> 通用行为数据主题主题概述
描述:DW层分为DWD和DWS层,是数据仓库维度建模的核心,需紧绕业 务过程来设计。
示例: 用户产品浏览主题
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_actlog_product_view (
user_id string COMMENT '用户id',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
target_id string COMMENT '产品ID',
ct BIGINT COMMENT '产生时间'
)
1 数据依赖: ODS层的用户行为日志(ods_nshop.ods_nshop_01_useractlog)
2 哪些维度(包括关联其他主题维度)、度量?
维度:
1 以用户相关的维度【user_id、os、os_version、manufacturer等等】
2 关联相关主题维度【target_id】
3 度量值 聚合操作(sum,count等等)
DWD明细层
1.DWD概述
明细粒度事实层以业务过程作为建模驱动,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理. 明细粒度事实层(DWD)通常分为三种:事务事实表、周期快照事实表和累积快照事实表。
2 DWD中的信息有什么?
事实表中一条记录所表达的业务细节程度被称为粒度。通常粒度可以通过两种方式来表述:一种是维度属性 组合所表示的细节程度,一种是所表示的具体业务含义。
作为度量业务过程的事实,通常为整型或浮点型的十进制数值,有可加性、半可加性和不可加性三种类型:
(1) 可加性事实是指可以按照与事实表关联的任意维度进行汇总。
示例:交易订单记录表中的【用户ID】可以进行count|distinct count汇总
(2) 半可加性事实只能按照特定维度汇总,不能对所有维度汇总。
示例:库存可以按照地点和商品进行汇总,而按时 间维度把一年中每个月的库存累加则毫无意义。 交易订单记录表中的【时间维度、地区维度】按照这类“自然属性”的维度进行统计,在主题层没有实际意 义,而偏统计报表类计算更多在DM层进行汇总,或者在DWS层往往是以某个主题数据做核心,与其产生关系 的其他主题数据作为度量值来进行统计汇总的。
(3) 完全不可加性。
示例:转化率、比率型等事实。事务事实表
事务事实表用来描述业务过程,跟踪空间或时间上某点的度量事件,保存的是最原子的数据,也称为原子事 实表。
示例:交易订单记录表、广告投放数据表,这类数据本身是一个业务过程。周期快照事实表
周期快照事实表中的每行汇总了发生在某一标准周期, 如一天、 一周或一月的多个度量。 其粒度是周期 性的时间段, 而不是单个事务。周期快照事实表通常包含许多数据的总计, 因为任何与事实表时间范围一 致的记录都会被包含在内。
示例:
一个月|一周的销售订单周期快照, 用于按产品统计每个月总的销售订单金额和产品销售数量累积快照事实表
累积快照事实表用来表述过程开始和结束之间的关键步骤事件,覆盖过程的整个生命周期,通常具有多个日 期字段来记录关键时间点。当累积快照事实表随着生命周期不断变化时,记录也会随着过程的变化而被修 改。
具体实现方式:拉链表DWS汇总层
DWS是基于DWD数据,以其中的主题信息为维度,以其他主题数据为统计度量的数据集合表
示例:
主题为【交易主题】下的订单记录
粒度1:【order_id, order_status,payment_money, order_ctime】是订单业务相关的维度信息
粒度2:【customer_id】用户主题相关,另外与支付主题相关
用户主题的用户启动日志表【DWD】建表示例:
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_actlog_launch (
user_id string COMMENT '用户id',
device_num string COMMENT '设备号',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
launch_time_segment string COMMENT '启动时间段',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dw/user/dwd_nshop_actlog_launch/'
交易主题域的交易订单明细流水表【DWD】示例:
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_orders_details (
order_id string COMMENT '订单ID',
order_status INT COMMENT '订单状态:5已收货(完成)|6投诉 7退货',
supplier_code VARCHAR (20) NOT NULL COMMENT '店铺ID',
product_code VARCHAR (20) NOT NULL COMMENT '商品ID',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
user_areacode string COMMENT '用户所在地区',
consignee_zipcode string COMMENT '收货人地址',
pay_type string COMMENT '支付类型:线上支付 10 网上银行 11 微信 12 支付宝 | 线下支 付(货到付款) 20 ',
pay_count INT COMMENT '支付次数',
product_price DECIMAL (5, 1) NOT NULL COMMENT '购买商品单价',
weighing_cost DECIMAL (2, 1) NOT NULL COMMENT '商品加权价格',
district_money DECIMAL (4, 1) NOT NULL DEFAULT 0.0 COMMENT '优惠金额',
is_activity NOT NULL DEFAULT 0 COMMENT '1:参加活动|0:没有参加活动',
order_ctime BIGINT COMMENT '创建时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dwd/order/dwd_nshop_orders_details/'
营销活动主题的广告投放数据表【DWD】示例:
CREATE external TABLE
IF NOT EXISTS dwd_nshop.dwd_nshop_releasedatas (
customer_id string COMMENT '用户id',
device_num string COMMENT '设备号',
device_type string COMMENT '设备类型',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
area_code string COMMENT '地区编码',
release_sid string COMMENT '投放请求id',
release_ip string COMMENT '投放方ip',
release_session string COMMENT '投放会话id',
release_sources string COMMENT '投放渠道',
release_category string COMMENT '投放浏览产品分类',
release_product string COMMENT '投放浏览产品',
release_product_page string COMMENT '投放浏览产品页',
ct BIGINT COMMENT '创建时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/dwd/release/dwd_nshop_releasedatas/'
- DIM维表层
MySQL业务数据对应的Hive表
中文含义 | MYSQL表名 | HIVE表名 |
---|---|---|
商品分类表 | nshop.category | dim_nshop.dim_pub_category |
店铺表 | nshop.supplier | dim_nshop.dim_pub_supplier |
商品表 | nshop.product | dim_nshop.dim_pub_product |
页面布局表 | nshop.page_dim | dim_nshop.dim_pub_page |
通用字典表 | nshop.comm_dim | dim_nshop.dim_pub_comm |
时间字典表 | nshop.date_dim | dim_nshop.dim_pub_date |
地区字典表 | nshop.area_dim | dim_nshop.dim_pub_area |
- MID中间层
用户启动统计【MID】建表示例:
CREATE external TABLE
IF NOT EXISTS mid_nshop.mid_nshop_actlog_launch_timesegs (
user_id string COMMENT '用户id',
os string COMMENT '手机系统',
os_version string COMMENT '手机系统版本',
manufacturer string COMMENT '手机制造商',
carrier string COMMENT '电信运营商',
network_type string COMMENT '网络类型',
area_code string COMMENT '地区编码',
launch_times string COMMENT '24bit表示24小时启动情况',
launch_count INT COMMENT '用户每天启动次数',
ct BIGINT COMMENT '产生时间'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/mid/actlog/mid_nshop_actlog_launch_timesegs/'
- ADS应用数据层
总体运营统计的流量类指标_平台统计表【ADS】建表示例:
CREATE external TABLE
IF NOT EXISTS ads_nshop.ads_nshop_platform_flow_stat (
customer_gender TINYINT NOT NULL COMMENT '性别:1男 0女',
age_range VARCHAR (10) NOT NULL COMMENT '年龄段',
customer_natives VARCHAR (10) NULL COMMENT '所在地区',
visit_avg_duration INT COMMENT '人均页面访问时长',
visit_avg_counts INT COMMENT '人均页面访问数'
) partitioned BY (bdp_day string) stored AS parquet location '/data/nshop/ads/operation/ads_nshop_platform_flow_stat/'
5.数仓结构图
数仓运行简图:
数仓具体运行流程图: