在数据仓库和ETL(Extract, Transform,
Load)流程中,处理数据变更、延迟到达的数据以及模式变更是一项挑战。SQLMesh作为一款强大的数据建模工具,提供了多种特性来帮助数据工程师优雅地处理这些问题。本文将深入探讨SQLMesh中的三个关键特性:Lookback、Forward-Only和Auto-Restatement,以及它们如何帮助构建更健壮的数据管道。
Lookback是SQLMesh中一个非常有用的特性,它允许模型访问当前处理时间间隔之前的一些数据点。这对于处理延迟到达的数据(late-arriving data)特别有用,在现实世界的数据管道中,这种情况很常见。
Lookback必须是一个正整数,它指定了模型应该包含当前处理时间间隔之前的多少个interval_units
。具体来说:
@daily
cron表达式(即interval_unit
为天),lookback值为7意味着模型将包含当前处理日期之前的7天数据。MODEL (
name test_db.national_holidays,
cron '@daily',
kind INCREMENTAL_BY_UNIQUE_KEY (
unique_key key,
-- 包含当前处理日期之前的7天数据
lookback 7
)
);
在这个例子中,national_holidays
模型每天运行一次,但会检查当前日期之前的7天数据,确保不会错过任何延迟到达的节假日数据。
Forward-Only是一个标志,设置为true
时表示该模型的所有变更都应该是向前兼容的。这意味着:
在数据管道中,尤其是生产环境中,表的下游可能依赖于上游表的结构。如果上游表的结构发生不兼容的变更,可能会导致下游系统崩溃或产生错误结果。
Forward-Only模型通常与Lookback一起使用,因为:
当Forward-Only模型或增量模型在Forward-Only计划中进行破坏性变更(如删除列)时,SQLMesh提供了三种处理方式:
这有助于防止意外的破坏性变更影响生产环境。
MODEL (
name test_db.user_profiles,
cron '@daily',
kind INCREMENTAL_BY_TIME_RANGE (
time_column updated_at
),
forward_only true,
on_destructive_change error -- 默认值,也可以显式设置
);
Auto-Restatement是SQLMesh的一个特性,它允许模型在特定时间自动重新计算部分或全部历史数据。这对于以下场景很有用:
auto_restatement
的模型只能在开发环境中预览,生产环境不会重用这些数据MODEL (
name test_db.national_holidays,
cron '@daily',
kind INCREMENTAL_BY_TIME_RANGE (
time_column event_ts,
-- 每周自动重新计算最后7天的数据
auto_restatement_cron '@weekly',
auto_restatement_intervals 7
)
);
在这个例子中,national_holidays
模型每天运行,但每周会自动重新计算最后7天的数据,这有助于捕捉任何延迟到达的节假日信息。
假设你有一个日志分析模型,每天运行一次,但日志数据可能会延迟几个小时甚至几天到达。你可以:
lookback
为1或2,确保当天能包含前一天或前两天的数据auto_restatement_cron
为@daily
,auto_restatement_intervals
为1,每天检查是否有前一天的数据到达假设你有一个产品维度表,事实表依赖于它。当产品维度表发生变更时:
forward_only true
on_destructive_change error
防止意外变更auto_restatement_cron
定期重新计算受影响的事实表数据SQLMesh提供的Lookback、Forward-Only和Auto-Restatement特性为数据工程师提供了强大的工具来构建健壮、可靠的数据管道:
通过合理组合这些特性,数据团队可以构建既能适应现实世界数据挑战,又能保持生产环境稳定的数据管道。记住,最好的数据管道是那些能够优雅地处理意外情况,同时保持简单和可维护性的管道。