ETL 如何实现增量更新
背景
当前 BI 的 Smart-ETL 无法直接实现数据集的增量更新,每次 ETL 的运行就是全量的数据覆盖,当数据量越来越大的时候,每个 ETL 的性能就越来越差,系统整体运行的 ETL 时长也越来越长,如果能使用 BI 的 Smart-ETL 实现数据的增量更新问题就可以解决了。
解决方案
本方案历史数据是以月为周期、存量数据 ETL 每月 2 号晚上 6 点更新本月前所有数据。增量数据 ETL 每日凌晨更新当月数据,其中 1、2 号更新本月和上月数据、3 号后只更新本月数据。
ETL 整体分层设计
- DW 层 ETL 分为 DW- 样例表 (本月前)、DW- 样例表 (本月),因为 DW 层不被卡片使用所以可以不用做合并数据集。
2、DM 层 ETL 分为 DM- 样例表 (本月前)、DM- 样例表 (注:这个 ETL 把增量 DM 和本月前 DM 数据集合并了)
ETL 详细设计
DW- 样例表 (本月前)
-- 保证取的数据是本月之前的数据
SELECT * FROM input1 WHERE `创建时间`< DATE_TRUNC('month',CURRENT_DATE())
DW- 样例表 (本月)
-- '-2'保证在1、2号的凌晨的时候上个月的数据还在增量数据集中、因为历史数据集是2号晚上才更新。
SELECT * FROM input1 WHERE `创建时间`>= DATE_TRUNC('month',CURRENT_DATE())
DM- 样例表 (本月前)
直接使用 DW- 样例表 (本月前做为 DW 层数据集、生成对应 DM)

DM- 样例表
本月增量更新的 DM 和本月前的 DM 做行拼接合并成完整的 DM 数据集,可以被业务直接使用

业务价值
通过增量更新,ETL 的性能对比全量更新性能提升 3~5 倍、存量数据量越大、ETL 越复杂增量更新性能提升更多。如果以后 BI 对行拼接的性能有优化的化,性能可以得到进一步提升。