投影数据周期说明
一、核心概念
在开始之前,请先了解以下关键概念:
| 名词 | 说明 |
|---|---|
| 数据周期 | 表示数据的时间粒度: 无:无明确时间周期(实时数据或静态数据) 日:按天更新的数据 * 月:按月更新的数据 粒度关系: 日 < 月 < 无(日粒度最细) |
| 强依赖 | 基于该投影和上游投影的数据周期判断是否进行更新。 当上游所有任务都完成目标周期(或更细粒度)的数据更新后,该任务才会执行 |
| 弱依赖 | 不校验数据周期的一致性 |
二、整体设计思路
设计目标: 让下游的更新频率匹配上游最频繁的数据变化,同时避免无意义的刷新操作。
注意事项:仅在强依赖的条件下,校验数据周期的一致性和覆盖性。
| 阶段 | 核心逻辑 | 目的 |
|---|---|---|
| 定义阶段 | 下游投影的数据周期:自动继承上游最细粒度的数据周期。 例如:上游为“日 + 月”,则下游投影的数据周期为“日”。 |
确定投影的数据周期 |
| 运行时 | 检查上游是否有当前周期或更细粒度的更新记录。 周期包含规则:按自然时间判断,大周期包含小周期。 例如:2025年11月(月周期)包含 2025-11-01~2025-11-30(日周期) 匹配逻辑: 投影周期为"月" → 上游则有该月或该月内任一天的更新均满足 投影周期为"日" → 上游需有该日的更新才满足 |
决定是否刷新物化表 |
三、定义阶段逻辑
自动推断规则
核心原则:取最细粒度(忽略"无")
| 上游基础视图数据周期 | 下游逻辑视图推断结果 | 推断逻辑 |
|---|---|---|
| 无、月、日 | 日 | 有日就取日 |
| 无、日 | 日 | 有日就取日 |
| 无、月 | 月 | 无日取月 |
| 日、月 | 日 | 有日就取日 |
| 仅无 | 无 | 全为无则为无 |
简化规则:
如果上游包含“日” → 下游为“日”,否则如果上游包含“月” → 下游为“月”, 否则 → 下游为“无”
业务场景示例
场景1:订单分析看板
场景2:月度财务报表
场景3:实时监控看板
四、运行时判断逻辑
投影刷新规则
判断条件: 投影刷新前,检查上游是否有同周期或更细粒度的更新
投影数据周期 = 日
→ 需要检查:上游是否有"日"粒度的更新记录
→ 如果有 → 触发刷新
→ 如果没有 → 跳过刷新
投影数据周期 = 月
→ 需要检查:上游是否有"月"或"日"粒度的更新记录
→ 如果有 → 触发刷新
→ 如果没有 → 跳过刷新
投影数据周期 = 无
→ 任何上游更新都可能触发刷新
业务场景示例
场景1:日报表刷新
投影:每日销售汇总(数据周期:日)
上游依赖:
- 基础视图A:订单表(数据周期:日)
- 基础视图B:用户表(数据周期:无)
运行时刻:2025-11-18 凌晨2点
判断逻辑:
1. 检查上游基础视图是否有 2025-11-17 的更新记录
2. 订单表:有 2025-11-17 的新数据 ✅
3. 用户表:无周期,不影响判断
4. 结论:触发刷新
场景2:月报表刷新
投影:月度财务报表(数据周期:月)
上游依赖:
- 基础视图A:配置表(数据周期:无)
- 基础视图B:月度账单表(数据周期:月)
运行时刻:2025-12-01 凌晨
判断逻辑:
1. 需要生成 2025-11 月的月报
2. 检查上游是否有 2025-11 月的更新记录
3. 月度账单表:有 2025-11 月的完整数据 ✅
4. 结论:触发刷新
场景3:混合周期场景
逻辑视图:综合分析报表(数据周期:日,因上游有日数据)
上游依赖:
- 基础视图A:日订单(周期:日)
- 基础视图B:月预算(周期:月)
运行时刻:2025-11-18
判断逻辑:
1. 逻辑视图周期为"日",需检查是否有日更新
2. 日订单表:有 2025-11-17 的更新 ✅
3. 月预算表:周期为月,需要判断是否包含2025-11-17的数据,包含✅
4. 结论:触发刷新(因为有日粒度更新)
特殊情况:
- 如果月预算表没有2025-11-17的数据,日订单表无新数据,则跳过刷新(因为没有日粒度更新)
五、常见问题
Q1: 为什么取最细粒度?
A: 保证数据新鲜度
-
如果上游有日数据,下游也应该能每日更新
-
避免数据滞后(上游日更新,下游月更新)
举例:
Q2: 为什么检查同周期或更细粒度?
A: 避免无效刷新
举例:
原理:
-
日报表依赖"日"粒度数据
-
月预算表是"月"粒度,对日报表来说太粗了
-
月预算更新不影响今天的日报数据
-
跳过刷新,节省计算资源
Q3: "无"周期有什么特殊性?
A: "无"的含义有两种:
-
静态配置表(很少更新)
- 例如:产品分类表、地区代码表
-
实时数据(随时更新)
- 例如:监控数据、实时流数据