在数据仓库架构中,缓慢变化维度(Slowly Changing Dimensions, SCD) 是处理历史数据追踪的核心技术。SQLMesh作为新一代数据编织平台,其支持的SCD Type 2模型通过
valid_from
和valid_to
双时间戳机制,为开发者提供了灵活的历史状态管理能力。本文将深入解析SQLMesh SCD Type 2的两种实现模式(基于时间戳与列级变更检测)、关键配置项及删除操作处理逻辑,让你彻底掌握缓慢变化维度的双轨制解决方案。
SQLMesh通过向目标表自动注入valid_from
(生效时间)和valid_to
(失效时间)两列,构建完整的历史版本控制机制:
valid_from ≤ current_time < valid_to
表示记录当前有效valid_to
默认为NULL
,表示持续有效关键限制:
当源表包含明确的更新时间戳字段时,此模式能实现毫秒级精度变更追踪。
实现示例:
MODEL (
name db.menu_items,
kind SCD_TYPE_2_BY_TIME (
unique_key id,
updated_at_name my_updated_at -- 自定义时间戳列名
)
);
SELECT
id::INT,
name::STRING,
price::DOUBLE,
my_updated_at
FROM
stg.current_menu_items;
物化表结构:
TABLE db.menu_items (
id INT,
name STRING,
price DOUBLE,
my_updated_at TIMESTAMP,
valid_from TIMESTAMP,
valid_to TIMESTAMP
);
核心机制:
updated_at
字段检测变更时间点updated_at_name
参数)适用于无明确时间戳字段的场景,通过监控指定列的值变化触发历史记录生成。
实现示例:
MODEL (
name db.menu_items,
kind SCD_TYPE_2_BY_COLUMN (
unique_key id,
columns [name, price] -- 监控name与price列的变更
)
);
SELECT
id::INT,
name::STRING,
price::DOUBLE
FROM
stg.current_menu_items;
物化表结构:
TABLE db.menu_items (
id INT,
name STRING,
price DOUBLE,
valid_from TIMESTAMP,
valid_to TIMESTAMP
);
执行逻辑:
SQLMesh允许对valid_from
/valid_to
列进行重命名,以满足不同数据治理规范。
配置示例:
MODEL (
name db.menu_items,
kind SCD_TYPE_2_BY_TIME (
unique_key id,
valid_from_name audit_start_time,
valid_to_name audit_end_time
)
);
物化表结构:
TABLE db.menu_items (
id INT,
name STRING,
price DOUBLE,
updated_at TIMESTAMP,
audit_start_time TIMESTAMP,
audit_end_time TIMESTAMP
);
SQLMesh提供两种硬删除处理模式,需根据业务场景选择:
配置项 | 默认值(false)行为 | 设置为true行为 |
---|---|---|
invalidate_hard_deletes | 保留被删记录的valid_to为NULL(视为持续有效) | 将valid_to设为执行时间戳,标记为历史状态 |
重新插入记录逻辑 | 新记录valid_from取max(原valid_from,新updated_at) | 新记录valid_from取执行时间,原记录保持历史完整性 |
场景示例:
valid_from
/valid_to
语义清晰invalidate_hard_deletes
配置延伸阅读: