董超华:阿里OneData分层建模体系

     分类 [产品经理]
2022/12/5 9:30:20 浏览量  788 喜欢  28
导读:什么是数据库,什么是数据仓库,数据仓库和数据库的区别是什么,数据仓库为什么要分层存储?

董超华:阿里OneData分层建模体系

要想了解为什么要进行数据模型设计,首先我们要了解一些概念,比如什么是数据库,什么是数据仓库,数据仓库和数据库的区别是什么,数据仓库为什么要分层存储。这篇文章会针对以上问题给出清晰明确的解释。

3.2.1  什么是数据库和数据仓库

假设公司领导让你统计公司当月的总交易额,如果你的公司只有一条业务线,那么这项工作就十分简单。

首先,你可以从业务系统中拉取业务线的全部订单,订单的格式类似表3-1

表3-1 数据库订单数据格式

订单ID

用户ID

商品ID

金额

时间

1344412

244

555

500

2020/04/19

1344413

245

556

1500

2020/04/19

接着,你可以提取当月的订单,并针对下单金额做汇总。最后,你就可以将汇总计算出的交易额数据准确无误地提交给领导。

但是如果你所在的公司是一家大型上市公司,公司内部有多条业务线,你的领导要求你汇总各个业务线当月的总交易额,你应该怎么做?在没有数据仓库的情况下,你会这样处理:首先统计公司有多少条产品线;然后找到每条产品线的业务负责人,索要当月该产品线的订单;接着将所有订单汇总到Excel中,这时候你会发现,因为业务形态的不同,各个业务线给你的订单数据没有一个统一的标准,比如订单状态,每条业务线都会有自己的标准。你应该以怎么样的口径统计每条业务线的交易额呢?因为标准不统一,会导致你的工作效率很低,而且统计的数据不一定准确。

而如果有了数据仓库,你就可以提前对每个业务线做调研,统一交易额的口径(包括业务口径、技术口径、计算方式、统计周期等)。因为交易额属于交易模块,你可以针对交易模块进行主题建模,比如你需要统计3月份公司旗下所有业务线的交易额,那么统计维度就是时间,指标就是交易额。在建模完成后,数据开发工程师可以将业务数据库中的数据定时同步到数据仓库,格式如表3-2所示

表3-2 数据仓库订单数据格式

业务线

订单ID

用户ID

商品ID

金额

时间

A

1344412

244

555

500

2020/04/19

B

1344413

245

556

1500

2020/04/19

......

......

......

......

......

......

接着数据开发工程师可以针对已经汇总好的订单数据按照月份的维度做进一步汇总统计并存储下来,具体格式如表3-3所示

表3-3 数据仓库订单汇总数据

月份

总交易额

202003

457688

202004

667778

......

......

因为提前做了汇总,那么下次你就可以直接从数据仓库中取出当月公司的任何产品线的交易额,就很快解决了领导交待的任务。

通过以上案例我们可以看出数据库与数据仓库的用途是完全不同的。数据库和数据仓库虽然都是用来存储数据的,但数据库是用来存储业务数据的,而数据仓库是用来存储汇总后的报表数据的。

什么是业务数据呢?业务数据就是对现实业务的数据虚拟,比如表3-2中的订单业务数据就是记录某人在什么时间买了什么商品,其中的用户ID就是用户的唯一标识;还有另外一个用户数据库,用于记录用户的数据比如手机号、姓名、年龄等信息,商品ID就是商品的唯一标识;还有商品数据库,用于记录商品的相关信息如品类、颜色、尺码等。

数据仓库的主要作用是存储汇总统计的数据,以支撑公司的决策分析。一般来说,数据仓库的数据量是比较大的,而且其汇总统计的数据一般是不会再有变化的,比如上文提到的公司3月份的交易额,这个汇总的数据不会因为新增的订单而变化,而业务数据库的数据量会随着用户的交易次数增多而增多。如果公司只有一条业务线,那么完全没有必要搭建数据仓库,基于数据库已经足够做统计分析,但是当公司有多条业务线,而且要做大量的数据分析工作时,那就适合搭建数据仓库。

3.2.2  数据仓库的分层建模体系

针对数据中台数据模型的分层,业界比较通用的分层方式是将数据模型分为5层:①ODS(Operate Data Store,操作数据层)、②DIM(Dictionary Data Layer ,维度数据层)、③DWD(Data Warehouse Detail ,明细数据层)、④DWS(Data Warehouse Service,汇总数据层)、⑤ADS(Application Data Store,数据应用层)。

各层数据模型之间的关系如图3-4所示。

董超华:阿里OneData分层建模体系

图3-4 分层模体系

第一层是ODS和DIM层。ODS层数据是数据仓库的第一层数据,是业务数据库的原始数据的复制,例如,每条产品线的用户信息、订单信息等数据一般都是原封不动地同步到数据中台的ODS层中。ODS层的作用是在业务系统和数据仓库之间形成一个隔离层,在数据中台进行计算任务时,可以以ODS层的数据为基础进行计算,从而不给业务数据库增加负担。DIM层存储的是维度数据如城市、省份、客户端等维度的数据。

第二层是DWD。DWD层数据是数据仓库的第二层数据,一般是基于ODS和DIM层的数据做轻度汇总。DWD层储存经过处理后的标准数据,需要对ODS层数据进行再次清洗(如去空/去脏数据、去超过极限的数据等操作)。DWD层的结构和粒度一般与ODS层保持一致,但是DWD汇总了DIM层的维度数据,比如在ODS层只能看到客户端的ID字段,但是在DWD不但能看到客户端ID字段,还能看到客户端的名称字段。

第三层是DWS层。DWS层数据是数据仓库的第三层数据,是以DWD层的数据为基础进行汇总计算的数据。DWS层都是各个维度的汇总数据,比如某日某产品线的访问用户数、收藏用户数、加购用户数、下单用户数、支付用户数等。

第四层是ADS层。ADS层数据是数据仓库的最后一层数据,以DWS层数据为基础进行数据处理。设计ADS层的最主要目的就是给数据可视化应用提供最终的数据。后端开发工程师基于ADS层的数据将最终数据结果以接口的形式展示给数据中台的应用层。

数据仓库为什么要分层建模呢?我们还是通过实际案例来理解。假设还是要统计某条产品线A当月的交易额,如果没有采用分层建模,那么数据统计就是以结果导向的,直接提取业务数据库中的产品线A的订单时间、订单金额,然后筛选时间为当月的订单,并基于订单金额做汇总计算,最后通过接口的方式将数据输出到应用层。

如果采用分层建模,第一步是将业务数据库的数据同步到ODS层中,第二步是通过DWD丰富统计指标的维度,目前案例中的需求是时间维度,可以预先增加其他常用的维度如产品线、客户端的维度,第三步是在DWD层汇总各个维度的交易额,第四步是基于现在的需求,计算出产品线A的当月交易额,在ADS层提供要显示的数据。

在实际数据中台项目中针对数据指标的开发,有以下2种情况比较常见

(1)数据指标口径发生变化。随着业务的变化,数据指标的统计口径不是一成不变的,数据指标经常会基于业务目标的变化而变化,相应的统计逻辑也会变化。

(2)增加数据指标的统计维度。单个维度的数据指标统计随着业务的发展有可能不再满足需求,此时很有可能遇到给数据指标增加统计维度的情况,数据指标的统计维度越丰富,就越有利于数据分析。

针对这两种情况我们分别看一下没有分层建模和分层建模的区别。

首先是第一种情况。

数据指标的统计口径发生了变化,比如统计口径由之前的统计产品线A的当月全部订单的交易额变为统计产品线A当月的订单状态为“已支付”的订单的交易额。此时其实数据指标并没有发生变化,仍然叫“交易额”,但是统计口径发生了变化。

如果没有进行分层建模,那么对外的接口要增加订单状态筛选的逻辑,再进行测试、核对数据、发布新版本接口才能完成针对交易额统计的优化。

如果进行了分层建模,ADS层、DWD层的数据是不用变化的,因为业务数据库的原始数据没有变化。此外,因为数据指标的显示没有变化,所以只需针对DWS层增加筛选订单状态为“已支付”的统计逻辑,然后由数据开发工程师、测试工程师测试DWS层并统计数据即可,不用发布新版本的对外接口,所以应用层并不用再针对接口做对接。

再看第二种情况。

给数据指标增加统计维度,比如不但要查看产品线A的当月交易额,还要查看产品线A的当月安卓端、iOS端的交易额。如果没有进行分层建模,每增加一个维度就增加一倍的工作量,要重新修改计算逻辑、重新定义对外接口、重新测试、重新发布新的版本才能完成数据指标的新的维度统计。如果进行了分层建模,由于DWD层和DWS层已经丰富了交易额的维度如产品线、客户端等,那么只需后端开发工程师在通过接口提取ADS层数据时新增维度“安卓端”和“iOS端”的统计结果,然后重新发布对外的接口即可,由于新的数据指标统计不需要数据开发工程师的参与,所以大大减少了数据中台开发的工作量。

3.3 数据模型设计实战案例

本节我们以电商产品主路径相关指标为例介绍一下分层建模的全过程。

如图3-5所示,我们要分客户端统计电商产品每天的访问首页用户数、访问商品列表页用户数、访问商品详情页用户数、收藏用户数、加购用户数、下单用户数、支付用户数,这样就可以看到每一步的转化率及流失率。基于这个功能,我们看一下如何通过分层建模,完成这些数据指标的统计。 

董超华:阿里OneData分层建模体系

图3-5 电商产品主路径相关指标

数据模型设计的第一步就是要了解产品功能涉及的业务流程及数据存储情况。本案例中的这个功能的业务流程比较简单,大家都比较熟悉:新用户一般是先进入首页,发现了首页中感兴趣的坑位后就会点击并进入商品列表页,接下来用户会进入商品详情页然后“加购”商品,如果用户真对商品感兴趣,就会进行提交订单和支付的操作。用户行为数据(如用户浏览了商品详情页)一般存储在埋点日志采集服务器中,而下单和支付数据存储在业务数据库或者业务中台中。

3.4.1  ODS层模型设计

ODS层一般都是把业务数据原封不动地同步到数据中台。我们先看一下案例中各个数据指标和数据源的分布情况。访问首页用户数、访问商品列表页用户数、访问商品详情页用户数这几个指标属于用户行为数据范畴,要统计这几个指标,我们需要记录哪个用户在什么时间在什么端浏览了哪个页面。在前面第2章笔者已经讲过,用户浏览以及点击的行为,可以通过数据埋点收集起来,我们只需从埋点采集日志文件中抽取用户的行为数据到数据数据中台即可。用户行为数据ODS层模型设计如表3-2所示。

表3-2 用户行为数据ODS层模型设计

表名

字段名

字段中文名

数据类型

映射方式

映射描述

ODS_LOG_PAGE_VIEW_D

DS

统计日期

Bigint

数据转换

SERVER_TIME转换为YYYYMMDDHH

ODS_LOG_PAGE_VIEW_D

OS

终端操作系统

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

OS_VERSION

终端操作系统的具体版本号

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

SCREEN_HEIGHT

屏幕的物理高度

Int

直接映射

 

ODS_LOG_PAGE_VIEW_D

SCREEN_WIDTH

屏幕的物理宽度

Int

直接映射

 

ODS_LOG_PAGE_VIEW_D

TITLE

页面标题

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

BROWSER

访问该系统当前浏览器的名字

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

BROWSER_VERSION

当前浏览器版本

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

SDK_LIB

当前埋点采用的SDK的类型

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

LIB_VERSION

当前SDK的版本号

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

IP

当前用户的公网IP

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

COUNTRY

当前用户所在国家

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

PROVINCE

所在省份/州

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

CITY

所城市

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

PHONE

手机号码

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

SERVER_TIME

事件发送到服务端处理后的时间

Bigint

直接映射

 

ODS_LOG_PAGE_VIEW_D

CLIENT_TIME

事件发生时客户端时间

Bigint

直接映射

 

ODS_LOG_PAGE_VIEW_D

TRAFFIC_SOURCE_ID

流量来源ID

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

DISTINCT_ID

唯一标识

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

USER_ID

用户ID

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

PAGE_NAME

页面名称

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

VIEW_DUR

页面浏览时长

Bigint

直接映射

 

ODS_LOG_PAGE_VIEW_D

URL_PATH

URL地址

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

RFRR_URL

前向URL

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

PLATFMT_CODE

所在平台代码

Bigint

直接映射

 

ODS_LOG_PAGE_VIEW_D

CLIENT_CODE

客户端代码

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

BUSS_ARGS

业务信息

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

EVENT_TYPE

事件类型

String

直接映射

页面浏览事件为0,按钮点击事件为1

ODS_LOG_PAGE_VIEW_D

LONGITUDE

用户当前所在的地理位置经度

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

LATITUDE

用户当前所在的地理位置纬度

String

直接映射

 

ODS_LOG_PAGE_VIEW_D

IS_FST_DAY

是否首日访问

String

枚举映射

True转为1,False转为0

ODS_LOG_PAGE_VIEW_D

IS_FST_TIME

是否首次访问

String

枚举映射

True转为1,False转为0

ODS_LOG_PAGE_VIEW_D

BANNER_ID

坑位ID

String

直接映射

进入页面的坑位ID

ODS_LOG_PAGE_VIEW_D

VIEW_TIME

进入页面时间戳

Bigint

直接映射

以时间戳的形式传值

在采集用户行为数据时,还能够采集很多其他维度的数据,比如当前用户所在的省份、城市等地理位置数据。针对电商产品主路径这个案例,采集其他维度数据需要用到的字段如下。

(1)DS:统计日期。这个日期为数据同步到数据中台的日期。

(2)PHONE:手机号码。登录的用户会记录该字段。

(3)DISTINCT_ID:用户唯一标识,提取自浏览器产生的CookieID,能够确定用户的唯一性。

(4)PAGE_NAME:页面名称。其记录用户访问了哪个页面。

(5)CLIENT_CODE:客户端代码。其用于通过客户端维度保存用户的访问记录。

(6)VIEW_TIME:访问页面的时间。

通过上述这些字段就可以知道用户在什么时候用哪个客户端访问了哪个页面,本案例中的访问首页用户数、访问商品列表页/详情页的用户数的明细数据就可以统计出来了。

接下来我们再看一下收藏用户数、“加购”用户数、下单用户数、支付用户数这几个数据指标,这些指标都存储在电商产品的业务系统或者业务中台中,都属于用户与商品之间的关系范畴。收藏数据存储在收藏表中,“加购”数据存储在加购表中,下单、支付数据存储在订单表中。如表3-3所示,这是交易模块的ODS层模型设计。

表3-3 交易模块的ODS层模型设计

表名

字段名

字段中文名

数据类型

备注

源表

映射方式

ODS_TRADE_ORDER_ITEM_D

ORDER_ITEM_ID

主键

Bigint

主键

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

CHANNEL_ID

渠道ID

Bigint

渠道ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

SELLER_ID

商户ID

Bigint

商户ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

SHOP_ID

店铺ID

Bigint

店铺ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

MEMBER_ID

用户ID

Bigint

会员ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ORDER_ID

订单ID

Bigint

订单ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

CATALOG_ID

类目ID

Bigint

类目ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

BRAND_ID

品牌ID

Bigint

品牌ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ITEM_ID

商品ID

Bigint

商品ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ITEM_TYPE

商品类型

Int

商品类型

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ITEM_CODE

商品Code

String

商品Code

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ITEM_NAME

商品名称

String

商品名称

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ITEM_NUM

商品数量

Int

商品数量

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

SKU_KEY

SKU_KEY

String

规格Key用于标识唯一商品

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

SKU_ID

规格ID

Bigint

规格ID

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

SKU_DESC

规格描述

String

规格描述

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ITEM_PRICE

商品单价

Decimal(10,2)

商品单价

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ITEM_DISCOUNTED_PRICE

优惠后商品单价

Decimal (10,2)

优惠后商品单价

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

SUBTOTAL_AMOUNT

金额小计

Decimal (10,2)

金额小计

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

ACTUAL_SUBTOTAL_AMOUNT

优惠后商品小计

Decimal (10,2)

优惠后商品小计

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

IS_NOT_CONDITION

是否无理由退货

Int

是否无理由退货

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

IS_DISCOUNT

是否参与优惠

Int

是否参与优惠

order_item

直接映射

ODS_TRADE_ORDER_ITEM_D

CREATE_TIME

创建时间

String

创建时间

order_item

直接映射

交易模块主要记录用户买了什么商品,表3-3详细记录了一个订单的各种信息,包括用户的信息、商品各种维度的信息、优惠的信息、发货的信息等,这些数据都需要同步到ODS层,后期如果涉及相关指标的开发,就不用再次建模。针对电商产品主路径这个案例,会用到的字段如下。

(1)MEMBER_ID:用户ID,用于记录用户是谁。

(2)ITEM_ID:商品ID,用于记录用户购买的商品。

(3)CREATE_TIME:记录下单时间。

(4)SUBTOTAL_AMOUNT:记录下单金额。

3.4.2  DWD/DWS层模型设计

DWD层数据的粒度和ODS层数据是一样的,都属于明细数据。不过DWD层会结合DIM层的数据做一层轻度汇总。DIM层中存放的是一个一个的维度数据,比如电商产品存储在DIM层的客户端信息如表3-4所示。

表3-4 客户端信息(DIM_USER_CLIENTDIM层模型设计

目标表信息(DIM_USER_CLIENT)

序号

字段名

字段中文名

主键

字段类型

1

CLIENT_CODE

客户端代码

 

String

2

CLIENT_NAME

客户端名称

 

String

3

CREATE_PERSON

创建人

 

String

4

CREATE_TIME

创建时间

 

String

5

UPDATE_PERSON

修改人

 

String

6

UPDATE_TIME

修改时间

 

String

7

DR

逻辑删除标志

 

Int

ODS层只会存储客户端代码,而DWD层则会关联DIM层的维度表,把客户端的名称也存储下来。针对电商产品主路径案例中的访问首页用户数、访问商品列表页用户数、访问商品详情页用户数这几个数据指标,DWD层就合并了DIM层的来源渠道名称,比如CLIENT_NAME(客户端名称)、REGIST_CHANNEL_NAME(平台名称)、BANNER_NAME(坑位名称)等维度的明细信息。详细设计如表3-5所示。

表3-5 访问相关指标的DWD层模型设计

表名

字段名

字段中文名

数据类型

备注

源表

映射方式

映射描述

DWD_LOG_VIEW_PAGE_DI

ONE_ID

统一ID

String

 

ODS_LOG_PAGE_VIEW_D

其他

默认-1

DWD_LOG_VIEW_PAGE_DI

USER_ID

用户ID

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

VISITOR_TYPE

访问者类型

Int

0 访客 ,1 用户

ODS_LOG_PAGE_VIEW_D

数据转换

 

DWD_LOG_VIEW_PAGE_DI

OS

终端操作系统

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

OS_VERSION

终端操作系统的具体版本号

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

SCREEN_HEIGHT

屏幕的物理高度

Int

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

SCREEN_WIDTH

屏幕的物理宽度

Int

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

BROWSER

访问该系统当前浏览器的名字

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

BROWSER_VERSION

当前浏览器版本

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

USER_AGENT

用户代理

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

SDK_LIB

当前埋点采用的SDK的类型

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

LIB_VERSION

当前SDK的版本号

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

IP

当前用户的公网IP

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

COUNTRY

当前用户所在国家

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

COUNTRY字段

DWD_LOG_VIEW_PAGE_DI

PROVINCE_CODE

省份代码

String

 

ODS_LOG_PAGE_VIEW_D

数据转换

 

DWD_LOG_VIEW_PAGE_DI

PROVINCE_NAME

省份名称

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

PROVINCE字段

DWD_LOG_VIEW_PAGE_DI

CITY_CODE

城市代码

String

 

ODS_LOG_PAGE_VIEW_D

数据转换

 

DWD_LOG_VIEW_PAGE_DI

CITY_NAME

城市名称

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

CITY字段

DWD_LOG_VIEW_PAGE_DI

SERVER_TIME

事件发送到服务端处理后的时间

Bigint

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

CLIENT_TIME

事件发生时客户端时间

Bigint

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

TRAFFIC_SOURCE_ID

流量来源ID

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

REGIST_CHANNEL_ID

来源渠道ID

String

 

DIM_REGIST_CHANNEL

其他

VI.TRAFFIC_SOURCE_ID = REG.channel_num

DWD_LOG_VIEW_PAGE_DI

REGIST_CHANNEL_NAME

来源渠道名称

String

 

DIM_REGIST_CHANNEL

其他

 

DWD_LOG_VIEW_PAGE_DI

DISTINCT_ID

唯一标识

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

PAGE_NAME

页面名称

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

VIEW_DUR

页面浏览时长

Bigint

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

URL_PATH

URL地址

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

RFRR_URL

前向URL

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

PLATFMT_CODE

所在平台代码

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

PLATFMT_NAME

平台名称

String

 

DIM_FLATFORM_CHANNEL

其他

VI.PLATFMT_CODE = PLT.channel_id

DWD_LOG_VIEW_PAGE_DI

CLIENT_CODE

客户端代码

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

CLIENT_NAME

客户端名称

String

 

DIM_USER_CLIENT

其他

VI.CLIENT_CODE = CLI.client_code

DWD_LOG_VIEW_PAGE_DI

BUSS_ARGS

业务信息

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

EVENT_TYPE

事件类型

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

LONGITUDE

用户当前所在的地理位置经度

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

LATITUDE

用户当前所在的地理位置纬度

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

IS_FST_DAY

是否首日访问

Int

(1:是,0:否)

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

IS_FST_TIME

是否首次访问

Int

(1:是,0:否)

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

PHONE

手机号码

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

BANNER_ID

坑位ID

String

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

DWD_LOG_VIEW_PAGE_DI

BANNER_NAME

坑位名称

String

 

DIM_FLUX_BANNER_INFO.TITLE

直接映射

ON BANNER_ID = BANNER_ID

DWD_LOG_VIEW_PAGE_DI

DS

统计日期

Bigint

 

ODS_LOG_PAGE_VIEW_D

直接映射

 

同样,针对电商产品主路径案例中的收藏用户数、加购用户数、下单用户数、支付用户数这几个数据指标, DWD层也会基于DIM层与ODS层的数据做轻度汇总,加入用户的昵称、省份名称、城市名称、商品的名称、类目名称、品牌名称、店铺名称等信息。详细设计如表3-6所示。

表3-6 访问相关指标的DWD层模型设计

表名

字段名

字段中文名

数据类型

备注

源表

映射方式

映射描述

DWD_TRADE_ORDER_PAID_DI

ONE_ID

统一ID

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ORDER_ID

订单ID

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ORDER_STATUS

订单状态

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

CHANNEL_ID

渠道ID

Bigint

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

CHANNEL_NAME

渠道名称

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

SELLER_ID

商户ID

Bigint

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

SELLER_NAME

商户名称

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

SHOP_ID

店铺ID

Bigint

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

SHOP_NAME

店铺名称

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

USER_ID

用户ID

STRING

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

REAL_NAME

会员姓名

String

 

DIM_MC_MEMBER_INFO

直接映射

 

DWD_TRADE_ORDER_PAID_DI

GENDER

性别

Bigint

1男2女3保密

DIM_MC_MEMBER_INFO

直接映射

 

DWD_TRADE_ORDER_PAID_DI

REGIST_CHANNEL_ID

注册渠道编码

String

 

DWD_LOG_USER_RGST_DI

其他

MEMBER_ID = USER_ID

DWD_TRADE_ORDER_PAID_DI

REGIST_CHANNEL_NAME

注册渠道名称

STRING String

 

DWD_LOG_USER_RGST_DI

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ITEM_ID

商品ID

Bigint

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ITEM_NAME

商品名称

String

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ITEM_PRICE

商品单价

Decimal (10,2)

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ITEM_NUM

商品数量

Bigint

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

SUBTOTAL_AMOUNT

金额小计

Decimal (10,2)

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

SKU_ID

规格ID

Bigint

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

SKU_DESC

规格描述

String

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

BRAND_ID

品牌ID

Bigint

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

BRAND_NAME

品牌名称

String

 

DIM_IT_BRAND

其他

BRAND_ID = BRAND_ID

DWD_TRADE_ORDER_PAID_DI

CATALOG_ID

类目ID

Bigint

 

ODS_TRADE_ORDER_ITEM_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

CATALOG_NAME

类目名称

String

 

DIM_CATALOG_INFO

其他

CATALOG_ID = CATALOG_ID

DWD_TRADE_ORDER_PAID_DI

TRANSACTION_TYPE

交易类型

Bigint

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

CREATE_TIME

下单时间

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

CREATE_AMT

下单金额

Decimal (16,2)

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

PAID_TIME

付款时间

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

PAID_AMT

支付金额

Decimal (16,2)

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

COMMISSION_AMT

佣金

Decimal (10,2)

佣金

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

PAID_METHOD

支付方式

String

 

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ORDER_NO

订单号

String

订单号

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

REAL_FREIGHT_AMOUNT

实付运费金额

Decimal (10,2)

实付运费金额

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

ITEM_AMOUNT

商品总金额

Decimal (10,2)

商品总金额

ODS_TRADE_ORDR_D

直接映射

 

DWD_TRADE_ORDER_PAID_DI

CLIENT_CODE

客户端代码

String

客户端代码

ODS_TRADE_ORDER_ITEM_D.sourceType.client

其他

 

DWD_TRADE_ORDER_PAID_DI

CLIENT_NAME

客户端名称

String

客户端名称

DIM_USER_CLIENT.CLIENT_NAME

其他

client = DIM_USER_CLIENT

.CLIENT_CODE

DWS层采用分主题面向服务形式的设计,针对DWD层的数据做了进一步汇总,比如电商产品主路径案例涉及用户主题下的相关数据指标,则DWS层的表说明如表3-7所示。

表3-7 DWS层表说明

主题域

类型

表英文名

表中文名

存储系统

备注

修改记录

用户

DWS

DWS_USER_TYPE_CUST_1D

客户数汇总-客户数类型粒度-天

Hive

按天分区

 

针对电商产品主路径案例的相关指标功能的DWS层详细设计如表3-8所示,这里已经分日期、平台、客户端记录了每天的访问首页用户数、访问商品详情页用户数、下单用户数、支付用户数等。DWS层将这些数据以竖表的形式存储,通过一条记录就可以查出本案例中的所有指标的数据,这样的设计比较节约存储资源。

表3-8 DWS层详细设计

表名

字段名

字段中文名

数据类型

备注

源表

映射描述

DWS_USER_TYPE_CUST_1D

DS

日期

Bigint

  

直接映射

DWS_USER_TYPE_CUST_1D

CHANNEL_ID

渠道ID

Int

  

直接映射

DWS_USER_TYPE_CUST_1D

CHANNEL_NAME

渠道名称

STRING

  

直接映射

DWS_USER_TYPE_CUST_1D

CLIENT_CODE

客户端ID

Int

  

直接映射

DWS_USER_TYPE_CUST_1D

CLIENT_NAME

客户端名称

STRING

  

直接映射

DWS_USER_TYPE_CUST_1D

CUST_DATA_TYPE

客户数类型

Int

1:访问首页用户数
2:浏览商品用户数
3:收藏用户数
4:试款用户数
5:领券用户数
6:加购用户数
7:下单用户数
8:支付用户数
9:分享用户数
10:退货用户数
11:提交结算用户数
12:完成订单用户数
13:有效订单用户数
14:复购用户数
15:访问首页用户数
16:访问商品列表页用户数

DWD_LOG_VIEW_PAGE_DI
DWD_LOG_VIEW_ITEM_DI
DWD_ITEM_COLLECT_DI
DWD_ITEM_SHOPCART_DI
DWD_LOG_BUTTON_CLICK_DI
DWD_TRADE_ORDER_PAID_DI
DWD_TRADE_ORDER_FLOW_DI
DWD_TRADE_FYTORDER_DI

数据转换

DWS_USER_TYPE_CUST_1D

CUST_CNT_1D

最近一天客户数

Bigint

  

计数

3.4.3  ADS层模型设计

最后我们再看一下ADS层模型设计。ADS层是面向应用的,其基于DWS层的汇总数据做最终的计算。ADS层会基于功能需求汇总数据,后端开发工程师只要通过接口的形式提取相应的数据进行展示即可。针对电商产品主路径案例,我们需要每天、每个客户端的访问首页用户数、访问商品列表页用户数、访问商品详情页用户数、收藏用户数、加购用户数、下单用户数、支付用户数等数据指标,ADS层的表结构基本和该案例所需数据结构相同,详细设计如表3-9所示。

表3-9 ADS层的详细设计

 

表名

字段名

字段中文名

数据类型

备注

源表

映射描述

ADS_USER_ACTIVE_1D

DS

统计日期

Bigint

格式为yyyymmdd

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

CHANNEL_ID

渠道ID

Int

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

CHANNEL_NAME

渠道名称

String

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

VISIT_CUST_CNT

访问用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

VISIT_ITEM_CUST_CNT

浏览商品详情页用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

COLLECT_ITEM_CUST_CNT

收藏用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

CLAIM_COUPON_CUST_CNT

领券用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

SHOPCART_CUST_CNT

加购用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

ORDER_CUST_CNT

下单用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

PAID_ORDER_CUST_CNT

支付用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

SHARE_CUST_CNT

分享用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

COMMIT_ORDER_CUST_CNT

下单用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

ETL_TIME

处理时间

String

 

from_unixtime(unix_timestamp(),'yyyy-mmdd hh:mm:ss')

数据转换

ADS_USER_ACTIVE_1D

VISIT_HOMEPAGE_CUST_CNT

访问首页用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

直接映射

ADS_USER_ACTIVE_1D

VISIT_ITEM_LIST_CUST_CNT

浏览商品列表页用户数

Bigint

 

DWS_USER_TYPE_CUST_1D

 

ADS_USER_ACTIVE_1D

CLIENT_CODE

客户端代码

String

   

ADS_USER_ACTIVE_1D

CLIENT_NAME

客户端名称

String

   

 

··············end ··············

 

标签

微信扫一扫,分享到朋友圈

微信公众号

相关推荐