第1章 项目介绍
数据大屏可以放置在领导办公室、会议室、公司前台或者各个部门的办公区域,领导可以全程监控各项指标的完成度,各个部门也可以将自己的指标可视化,每日更新或实时更新,通过活动赛马等分析模型营造紧张的备战状态。**数据大屏不仅可以**在活动复盘时呈现一个全局的数据结果,也能通过联动下钻等动态分析功能,层层剖析大促中存在的问题和表现比较好的点,做好**活动总结**。<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2492220/1650417142559-8b4c8e6a-d514-4aba-8e0e-8c8dbfe1b402.png#clientId=u44bd8263-263e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=298&id=u0ba79e0e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=260&originWidth=647&originalType=binary&ratio=1&rotation=0&showTitle=false&size=307743&status=done&style=none&taskId=u746b4e8a-c550-44fc-be72-a193998e719&title=&width=741.5454711914062)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2492220/1650417224872-5631372e-7f25-4633-be10-9dac48de4722.png#clientId=u44bd8263-263e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=440&id=u701793f8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=605&originWidth=1079&originalType=binary&ratio=1&rotation=0&showTitle=false&size=640541&status=done&style=none&taskId=udb54f95d-fe61-4a85-a940-b6d1f2dd032&title=&width=784.7272727272727)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2492220/1650417201639-0c574db3-cc21-44ec-a565-4115d8434970.png#clientId=u44bd8263-263e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=426&id=ua2c73e4a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=370&originWidth=655&originalType=binary&ratio=1&rotation=0&showTitle=false&size=109367&status=done&style=none&taskId=u3604cb3e-ab04-4393-a8fb-159ab3b72e8&title=&width=754.3636474609375)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/2492220/1650529139619-865e0eae-4cec-4c15-bdf6-f0abf26993a4.png#clientId=ue32ccde3-179f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=505&id=u05f76881&margin=%5Bobject%20Object%5D&name=image.png&originHeight=631&originWidth=1625&originalType=binary&ratio=1&rotation=0&showTitle=false&size=92940&status=done&style=none&taskId=u1b6db4bc-bb4d-4fd2-a949-c8bbabce931&title=&width=1300)
第二章 普通实时计算与实时数仓比较
普通的实时计算优先考虑时效性,所以从数据源采集经过实时计算直接得到结果。如此做时效性更好,但是弊端是由于计算过程中的中间结果没有沉淀下来,所以当面对大量实时需求的时候,计算的复用性较差,开发成本随着需求增加直线上升。
实时数仓基于一定的数据仓库理念,对数据处理流程进行规划、分层,目的是提高数据的复用性。
2.1 实时电商数仓,项目分为以下几层
- ODS
原始数据,日志和业务数据
- DWD
根据数据对象为单位进行分流,比如订单、页面访问等等
- DIM
维度数据
- DWM
对于部分数据对象进行进一步加工,比如独立访问、跳出行为,也可以和维度进行关联,形成宽表,依旧是明细数据。
- DWS
根据某个主题将多个事实数据轻度聚合,形成主题宽表。
- ADS
第三章 系统数据流程设计
2.1系统设计1.0版本-离线版本
2.2系统设计2.0版本-实时版本
2.3 离线计算与实时计算的比较
离线计算:就是在计算开始前已知所有输入数据,输入数据不会产生变化,一般计算量级较大,计算时间也较长。例如今天早上一点,把昨天累积的日志,计算出所需结果。最经典的就是Hadoop的MapReduce方式;
一般是根据前一日的数据生成报表,虽然统计指标、报表繁多,但是对时效性不敏感。从技术操作的角度,这部分属于批处理的操作。即根据确定范围的数据一次性计算。
实时计算:输入数据是可以以序列化的方式一个个输入并进行处理的,也就是说在开始的时候并不需要知道所有的输入数据。与离线计算相比,运行时间短,计算量级相对较小。强调计算过程的时间要短,即所查当下给出结果。
主要侧重于对当日数据的实时监控,通常业务逻辑相对离线需求简单一下,统计指标也少一些,但是更注重数据的时效性,以及用户的交互性。从技术操作的角度,这部分属于流处理的操作。根据数据源源不断地到达进行实时的运算
第四章实现逻辑
4.1需求梳理
统计主题 | 需求指标 | 输出方式 | 计算来源 | 来源层级 |
---|---|---|---|---|
访客 | pv | 可视化大屏 | page_log直接可求 | dwd |
uv | 可视化大屏 | 需要用page_log过滤去重 | dwm | |
跳出次数 | 可视化大屏 | 需要通过page_log行为判断 | dwm | |
进入页面数 | 可视化大屏 | 需要识别开始访问标识 | dwd | |
连续访问时长 | 可视化大屏 | page_log直接可求 | dwd | |
商品 | 点击 | 多维分析 | page_log直接可求 | dwd |
曝光 | 多维分析 | page_log直接可求 | dwd | |
收藏 | 多维分析 | 收藏表 | dwd | |
加入购物车 | 多维分析 | 购物车表 | dwd | |
下单 | 可视化大屏 | 订单宽表 | dwm | |
支付 | 多维分析 | 支付宽表 | dwm | |
退款 | 多维分析 | 退款表 | dwd | |
评论 | 多维分析 | 评论表 | dwd | |
地区 | pv | 多维分析 | page_log直接可求 | dwd |
uv | 多维分析 | 需要用page_log过滤去重 | dwm | |
下单 | 可视化大屏 | 订单宽表 | dwm | |
关键词 | 搜索关键词 | 可视化大屏 | 页面访问日志 直接可求 | dwd |
点击商品关键词 | 可视化大屏 | 商品主题下单再次聚合 | dws | |
下单商品关键词 | 可视化大屏 | 商品主题下单再次聚合 | dws |
4.2 业务架构图
第五章 埋点数据日志结构
我们的日志结构大致可分为两类,一是普通页面埋点日志,二是启动日志。
普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。
{
"common": { -- 公共信息
"ar": "230000", -- 地区编码
"ba": "iPhone", -- 手机品牌
"ch": "Appstore", -- 渠道
"is_new": "1",--是否首日使用,首次使用的当日,该字段值为1,过了24:00,该字段置为0。
"md": "iPhone 8", -- 手机型号
"mid": "YXfhjAYH6As2z9Iq", -- 设备id
"os": "iOS 13.2.9", -- 操作系统
"uid": "485", -- 会员id
"vc": "v2.1.134" -- app版本号
},
"actions": [ --动作(事件)
{
"action_id": "favor_add", --动作id
"item": "3", --目标id
"item_type": "sku_id", --目标类型
"ts": 1585744376605 --动作时间戳
}
],
"displays": [
{
"displayType": "query", -- 曝光类型
"item": "3", -- 曝光对象id
"item_type": "sku_id", -- 曝光对象类型
"order": 1, --出现顺序
"pos_id": 2 --曝光位置
},
{
"displayType": "promotion",
"item": "6",
"item_type": "sku_id",
"order": 2,
"pos_id": 1
},
{
"displayType": "promotion",
"item": "9",
"item_type": "sku_id",
"order": 3,
"pos_id": 3
},
{
"displayType": "recommend",
"item": "6",
"item_type": "sku_id",
"order": 4,
"pos_id": 2
},
{
"displayType": "query ",
"item": "6",
"item_type": "sku_id",
"order": 5,
"pos_id": 1
}
],
"page": { --页面信息
"during_time": 7648, -- 持续时间毫秒
"item": "3", -- 目标id
"item_type": "sku_id", -- 目标类型
"last_page_id": "login", -- 上页类型
"page_id": "good_detail", -- 页面对象ID
"sourceType": "promotion" -- 来源类型
},
"err":{ --错误
"error_code": "1234", --错误码
"msg": "***********" --错误信息
},
"ts": 1585744374423 --跳入时间戳
}
{
"common": {
"ar": "370000",
"ba": "Honor",
"ch": "wandoujia",
"is_new": "1",
"md": "Honor 20s",
"mid": "eQF5boERMJFOujcp",
"os": "Android 11.0",
"uid": "76",
"vc": "v2.1.134"
},
"start": {
"entry": "icon", --icon手机图标 notice 通知 install 安装后启动
"loading_time": 18803, --启动加载时间
"open_ad_id": 7, --广告页ID
"open_ad_ms": 3449, -- 广告总共播放时间
"open_ad_skip_ms": 1989 -- 用户跳过广告时点
},
"err":{ --错误
"error_code": "1234", --错误码
"msg": "***********" --错误信息
},
"ts": 1585744304000
}
5.1 数据源解说
5.1.1 页面
页面数据主要记录一个页面的用户访问情况,包括访问时间、停留时间、页面路径等信息。
"page": { --页面信息
"during_time": 7648, -- 持续时间毫秒
"item": "3", -- 页面对象id
"item_type": "sku_id", -- 页面对象类型
"last_page_id": "login", -- 上页id
"page_id": "good_detail", -- 页面id
"sourceType": "promotion" -- 来源类型
},
1)所有页面id如下
home("首页"),
category("分类页"),
discovery("发现页"),
top_n("热门排行"),
favor("收藏页"),
search("搜索页"),
good_list("商品列表页"),
good_detail("商品详情"),
good_spec("商品规格"),
comment("评价"),
comment_done("评价完成"),
comment_list("评价列表"),
cart("购物车"),
trade("下单结算"),
payment("支付页面"),
payment_done("支付完成"),
orders_all("全部订单"),
orders_unpaid("订单待支付"),
orders_undelivered("订单待发货"),
orders_unreceipted("订单待收货"),
orders_wait_comment("订单待评价"),
mine("我的"),
activity("活动"),
login("登录"),
register("注册");
2)所有页面对象类型如下:
sku_id("商品skuId"),
keyword("搜索关键词"),
sku_ids("多个商品skuId"),
activity_id("活动id"),
coupon_id("购物券id");
3)所有来源类型如下:
promotion("商品推广"),
recommend("算法推荐商品"),
query("查询结果商品"),
activity("促销活动");
5.1.2事件
事件数据主要记录应用内一个具体操作行为,包括操作类型、操作对象、操作对象描述等信息。
"actions": [{
"action_id": "cart_remove",
"item": "10",
"item_type": "sku_id",
"ts": 1608270798505
}],
1)所有动作类型如下:动作id(action_id)
favor_add("添加收藏"),
favor_canel("取消收藏"),
cart_add("添加购物车"),
cart_remove("删除购物车"),
cart_add_num("增加购物车商品数量"),
cart_minus_num("减少购物车商品数量"),
trade_add_address("增加收货地址"),
get_coupon("领取优惠券");
注:对于下单、支付等业务数据,可从业务数据库获取。
2)所有动作目标类型如下:item_type
sku_id("商品"),
coupon_id("购物券");
5.1.3 曝光
曝光数据主要记录页面所曝光的内容,包括曝光对象,曝光类型等信息。
"displays": [{
"display_type": "promotion",
"item": "8",
"item_type": "sku_id",
"order": 1,
"pos_id": 4
}, {
"display_type": "query",
"item": "2",
"item_type": "sku_id",
"order": 2,
"pos_id": 3
}, {
"display_type": "query",
"item": "3",
"item_type": "sku_id",
"order": 3,
"pos_id": 2
}
1)所有曝光类型如下:
promotion("商品推广"),
recommend("算法推荐商品"),
query("查询结果商品"),
activity("促销活动");
2)所有曝光对象类型如下:
sku_id("商品skuId"),
activity_id("活动id");
5.1.4 启动
启动数据记录应用的启动信息。
1)所有启动入口类型如下:
icon("图标"),
notification("通知"),
install("安装后启动");
5.2 埋点数据
主流埋点方式
目前主流的埋点方式,有代码埋点(前端/后端)、可视化埋点、全埋点三种。
代码埋点是通过调用埋点SDK函数,在需要埋点的业务逻辑功能位置调用接口,上报埋点数据。例如,我们对页面中的某个按钮埋点后,当这个按钮被点击时,可以在这个按钮对应的 OnClick 函数里面调用SDK提供的数据发送接口,来发送数据。
可视化埋点只需要研发人员集成采集 SDK,不需要写埋点代码,业务人员就可以通过访问分析平台的“圈选”功能,来“圈”出需要对用户行为进行捕捉的控件,并对该事件进行命名。圈选完毕后,这些配置会同步到各个用户的终端上,由采集 SDK 按照圈选的配置自动进行用户行为数据的采集和发送。
全埋点是通过在产品中嵌入SDK,前端自动采集页面上的全部用户行为事件,上报埋点数据,相当于做了一个统一的埋点。然后再通过界面配置哪些数据需要在系统里面进行分析。
埋点数据上报时机
埋点数据上报时机包括两种方式。
方式一,在离开该页面时,上传在这个页面产生的所有数据(页面、事件、曝光、错误等)。优点,批处理,减少了服务器接收数据压力。缺点,不是特别及时。
方式二,每个事件、动作、错误等,产生后,立即发送。优点,响应及时。缺点,对服务器接收数据压力比较大。