数据开发之离线计算_AB生产链路实践

数据开发之离线计算_AB生产链路实践

一、基础架构

1) 逻辑扩维:实验同质可比以及非实验上报的后置灵活观测场景抽象为业务事实表与实验分流维表间的逻辑扩维,避免物理层面的存算冗余和扩展性差的问题;

2) 逻辑变高:多种实验分流字段(PIN、UUID、PIN+UUID)引发的不同关联Key的场景抽象为自定义CASE WHEN关联键,基于单张多分流字段的分流维表实现维值扩充操作(具体指实验ID维度);

3) Flow-Node编排:实验场景(样本聚合、实验聚合)对于数据不同粒度的分析观测诉求抽象为加速策略中的三种Node节点类型:裁剪明细、轻聚合、预计算;当天决策以及累计行为和进组的科学观测抽象为 指标计算中的两种时间策略:当天、累计。同时上述整个DAG也会面临到节点间的动态调整,即节点可能跳过或引入新的节点依赖,这种动态编排决定哪些节点应执行,哪些不应执行。

4) 智能退化:不同实验不同的结束时间抽象为不同加速策略下不同的过期时间,同时伴随着BDP任务的自动禁用和Hive数据的主动删除。

二、生产实例

1) 裁剪明细:本质将指标所对应的业务事实表(如订单大盘表、曝光大盘表、点击大盘表),与实验分流维表进行RIGHT JOIN关联,扩展指标所需的实验ID、实验版本等实验维度信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
SELECT
t.dt dt,
t.browser_uniq_id,
t.user_log_acct,
t.event_id, -- 修饰维度
t.page_id, -- 下钻维度1(事实表)
t.os_plant, -- 下钻维度2(关联维表)
t.app_ver, -- 下钻维度3(关联维表)
d0.exp_label, -- 实验维度
d0.fst_enter_dt, -- 实验维度
d0.exp_id, -- 实验维度
d0.is_parent, -- 实验维度
d0.is_enter_today, -- 实验维度
d0.shunt_value, -- 实验维度
t.pv
FROM
(
SELECT
click.dt,
click.browser_uniq_id,
click.user_log_acct,
click.event_id,
click.page_id,
click.os_plant,
click.app_ver,
1 AS pv
FROM
(
SELECT
dt,
browser_uniq_id,
user_log_acct,
event_id,
page_id,
os_plant,
app_ver
FROM gdm.gdm_jdr_sch_d14_traffic_click_di
WHERE dt >= '2025-01-01' AND dt <= '2025-01-01'
ND browser_uniq_id IS NOT NULL
AND browser_uniq_id NOT IN ('', '-', 'NULL')
) AS click
) AS t
RIGHT OUTER JOIN
(
SELECT
exp_id,
exp_label,
shunt_value,
is_parent,
fst_enter_dt,
is_enter_today
FROM app.v_app_jdr_abtest_shunt_acc_dedup_a_d_d
WHERE dt = '2025-01-01' AND exp_id = 'xxxxxx'
) AS d0
ON (LOWER(TRIM(t.browser_uniq_id)) = LOWER(TRIM(d0.shunt_value)))
WHERE ( 1 = 1 )

2) 轻聚合:由于实验需要通过当日数据进行决策,通过累计数据进行监控和洞察,因此轻聚合阶段会完成样本粒度的当日、累计两种粒度的数据聚合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
dt,
exp_id,
exp_label,
shunt_value AS uuid,
SUM(pv) AS pv,
'day' AS tp --当天
FROM app.gdm_jdr_sch_d14_traffic_click_di_di_4940_dem_abtest
WHERE dt = '2025-01-01' AND is_enter_today = '1'
GROUP BY dt, exp_id, exp_label, shunt_value

UNION ALL

SELECT
dt,
exp_id,
exp_label,
shunt_value AS uuid,
SUM(pv) AS pv,
'all' AS tp -- 累计
FROM app.gdm_jdr_sch_d14_traffic_click_di_di_4940_dem_abtest
WHERE dt = '2025-01-01' AND exp_id = 'xxxxxx'
GROUP BY dt, exp_id, exp_label, shunt_value

3) 预计算:除了指标具体值计算之外,预计算阶段实验粒度的聚合还集成了数科相关的统计量信息(如样本量、样本和、样本平方和以及复合指标乘积和等),这些中间态数据完整支持了指标P值、置信区间的产出。

1
2
3
4
5
6
7
8
9
10
11
SELECT
dt,
exp_id,
exp_label,
tp, -- 当天 & 累计标志位
SUM(pv) AS pv, -- 指标绝对值
SUM(pv) AS pv_00_sum, -- 指标样本和
SUM(POW(pv, 2)) AS pv_00_pow_sum -- 指标样本平方和
FROM app.gdm_jdr_sch_d14_traffic_click_di_agg_di_4940_dem_abtest
WHERE dt = '2025-01-01' AND exp_id = 'xxxxxx'
GROUP BY dt, exp_id, exp_label, tp

4) 列转行Schema:作为数据服务终端查询的固定表信息,汇总了所有实验所有指标的预计算结果数据。基于单表秒级支撑实验报告的洞察分析。

参考文献

京东零售:数据编织在AB实验自动化中的实践