深入理解SQLMesh中的SCD Type 2:缓慢变化维度的实现与管理

在数据仓库和商业智能领域,处理随时间变化的数据是一个常见且具有挑战性的任务。缓慢变化维度(Slowly Changing Dimensions, SCD)是解决这一问题的经典模式。本文将深入探讨SQLMesh中SCD Type 2的实现方式、配置选项以及实际应用场景。

什么是SCD Type 2?

SCD Type 2是一种用于跟踪维度表中记录历史变化的模型。它通过为每条记录添加有效时间范围(valid_fromvalid_to)来实现这一点:

  • valid_from: 记录生效的起始时间(包含)
  • valid_to: 记录失效的结束时间(不包含),最新记录的valid_to设为NULL

这种设计允许我们不仅了解当前的数据状态,还能追溯任何时间点的历史数据。
在这里插入图片描述

SQLMesh中的SCD Type 2实现

SQLMesh提供了两种实现SCD Type 2的方式:基于时间戳和基于列值比较。

SCD Type 2 By Time(基于时间戳)

这是SQLMesh推荐的方式,适用于源表包含"更新时间"(updated_at)字段的情况。

模型定义示例:

MODEL (
  name db.menu_items,
  kind SCD_TYPE_2_BY_TIME (
    unique_key id,
  )
);

SELECT
  id::INT,
  name::STRING,
  price::DOUBLE,
  updated_at::TIMESTAMP
FROM
  stg.current_menu_items;

特点:

  • 使用updated_at字段精确确定记录变更时间
  • 提高SCD Type 2表的准确性
  • 需要源表包含时间戳字段

SCD Type 2 By Column(基于列值比较)

适用于源表不包含时间戳字段的情况,通过比较指定列的值变化来检测变更。

模型定义示例:

MODEL (
  name db.menu_items,
  kind SCD_TYPE_2_BY_COLUMN (
    unique_key id,
    columns [name, price]
  )
);

SELECT
  id::INT,
  name::STRING,
  price::DOUBLE,
FROM
  stg.current_menu_items;

特点:

  • 不需要updated_at字段
  • 通过比较指定列的值变化来检测变更
  • 变更时间基于SQLMesh执行时间

高级配置选项

SQLMesh提供了丰富的配置选项来定制SCD Type 2行为:

共享配置

  • unique_key: 用于标识源表和目标表之间行的唯一键
  • valid_from_name/valid_to_name: 自定义有效时间列名
  • invalidate_hard_deletes: 控制硬删除记录的处理方式
  • batch_size: 批处理大小,用于历史数据处理

SCD Type 2 By Time特有配置

  • updated_at_name: 指定包含时间戳的列名
  • updated_at_as_valid_from: 控制新记录valid_from的设置方式

SCD Type 2 By Column特有配置

  • columns: 指定需要检查变化的列(使用*表示所有列)
  • execution_time_as_valid_from: 控制新记录valid_from的设置方式
  • updated_at_name: 如果源表包含可用作valid_from的时间戳列

数据变更处理机制

记录更新

当检测到记录变更时,SQLMesh会:

  1. 将旧记录的valid_to设置为变更时间
  2. 插入新记录,valid_from设置为变更时间,valid_to为NULL

记录删除

删除处理取决于invalidate_hard_deletes设置:

  • 默认(false): 删除记录的valid_to保持NULL,如果记录重新添加,valid_to设置为新记录的valid_from
  • 设置为true: 删除记录的valid_to设置为SQLMesh运行开始时间,重新添加记录不会改变valid_to

查询SCD Type 2模型

SQLMesh提供了多种查询SCD Type 2模型的方法:

  1. 查询当前版本记录:

    SELECT * FROM menu_items WHERE valid_to IS NULL;
    
  2. 查询特定时间点的记录:

    SELECT * FROM menu_items 
    WHERE id = 1
    AND '2020-01-02 01:00:00' >= valid_from
    AND '2020-01-02 01:00:00' < COALESCE(valid_to, CAST('2199-12-31 23:59:59+00:00' AS TIMESTAMP));
    
  3. 查询已删除记录:

    SELECT id, MAX(CASE WHEN valid_to IS NULL THEN 0 ELSE 1 END) AS is_deleted
    FROM menu_items
    GROUP BY id;
    

历史数据处理与重置

SQLMesh支持处理包含历史数据的源表,通过设置batch_size为1可以按时间顺序处理每个间隔的数据。

重要提示:SCD Type 2模型设计上保护已捕获的历史数据,但可以通过设置disable_restatement为false来清除历史并重新开始。这是一个危险操作,可能导致数据不可恢复。

实际应用示例

SCD Type 2按时间实现示例。假设您的源表初始有以下数据,并且invalidate_hard_deletes设置为true:

ID名称价格更新时间
1鸡肉三明治10.992020-01-01 00:00:00
2芝士汉堡8.992020-01-01 00:00:00
3薯条4.992020-01-01 00:00:00

目标表当前为空,将会被物化为以下数据:

ID名称价格更新时间有效起始时间有效结束时间
1鸡肉三明治10.992020-01-01 00:00:001970-01-01 00:00:00NULL
2芝士汉堡8.992020-01-01 00:00:001970-01-01 00:00:00NULL
3薯条4.992020-01-01 00:00:001970-01-01 00:00:00NULL

现在假设您更新源表为以下数据:

ID名称价格更新时间
1鸡肉三明治12.992020-01-02 00:00:00
3薯条4.992020-01-01 00:00:00
4奶昔3.992020-01-02 00:00:00

变更摘要:

  • 鸡肉三明治的价格从10.99美元上涨到12.99美元
  • 芝士汉堡从菜单中移除
  • 奶昔被添加到菜单中

假设您的管道在2020-01-02 11:00:00运行,目标表将被更新为以下数据:

ID名称价格更新时间有效起始时间有效结束时间
1鸡肉三明治10.992020-01-01 00:00:001970-01-01 00:00:002020-01-02 00:00:00
1鸡肉三明治12.992020-01-02 00:00:002020-01-02 00:00:00NULL
2芝士汉堡8.992020-01-01 00:00:001970-01-01 00:00:002020-01-02 11:00:00
3薯条4.992020-01-01 00:00:001970-01-01 00:00:00NULL
4奶昔3.992020-01-02 00:00:002020-01-02 00:00:00NULL

在我们的最后一次更新中,假设您将源表更新为以下数据:

ID名称价格更新时间
1鸡肉三明治14.992020-01-03 00:00:00
2芝士汉堡8.992020-01-03 00:00:00
3薯条4.992020-01-01 00:00:00
4巧克力奶昔3.992020-01-02 00:00:00

变更摘要:

  • 鸡肉三明治的价格从12.99美元上涨到14.99美元(很不错!)
  • 芝士汉堡被重新添加到菜单中,使用原始名称和价格
  • 奶昔名称更新为"巧克力奶昔"

目标表将被更新为以下数据:

ID名称价格更新时间有效起始时间有效结束时间
1鸡肉三明治10.992020-01-01 00:00:001970-01-01 00:00:002020-01-02 00:00:00
1鸡肉三明治12.992020-01-02 00:00:002020-01-02 00:00:002020-01-03 00:00:00
1鸡肉三明治14.992020-01-03 00:00:002020-01-03 00:00:00NULL
2芝士汉堡8.992020-01-01 00:00:001970-01-01 00:00:002020-01-02 11:00:00
2芝士汉堡8.992020-01-03 00:00:002020-01-03 00:00:00NULL
3薯条4.992020-01-01 00:00:001970-01-01 00:00:00NULL
4奶昔3.992020-01-02 00:00:002020-01-02 00:00:002020-01-03 00:00:00
4巧克力奶昔3.992020-01-03 00:00:002020-01-03 00:00:00NULL

注意:芝士汉堡从2020-01-02 11:00:00到2020-01-03 00:00:00期间被删除,这意味着如果您在那个时间范围内查询表,将看不到芝士汉堡。这是基于源数据提供的菜单最准确的表示。如果芝士汉堡以原始更新时间戳2020-01-01 00:00:00被重新添加到菜单中,那么新记录的valid_from时间戳将是2020-01-02 11:00:00,导致没有时间段显示该项目被删除。由于在这种情况下更新时间戳没有变化,很可能该项目是错误删除的,这再次最准确地反映了基于源数据的菜单情况。

最后总结

SQLMesh中的SCD Type 2实现提供了灵活且强大的方式来处理缓慢变化维度。通过基于时间戳或列值比较的两种方法,以及丰富的配置选项,可以满足各种业务场景的需求。理解其工作原理和配置选项对于设计高效、准确的数据仓库至关重要。

无论是需要精确跟踪变更时间的场景,还是源表缺乏时间戳信息的情况,SQLMesh都提供了相应的解决方案。合理配置SCD Type 2模型,可以确保数据仓库既能反映当前状态,又能保留完整的历史变更记录,为业务分析提供坚实的数据基础。

资源下载链接为: https://pan.quark.cn/s/d3128e15f681 “Dabai Pro.zip”是ORBBEC Dabai Pro双目光结构摄像头的软件资源包,这是一款专为机器人开发和人工智能应用设计的高端传感器设备。Dabai Pro可能是该系列产品名称,其核心在于先进的3D感知技术,能够为机器人提供深度信息和精准的环境感知。 ORBBEC Dabai Pro双目光结构摄像头是关键所在,它采用了双目立体视觉技术,通过模拟人类双眼的视差原理,利用两个或多个摄像头计算物体距离和三维形状。这种摄像头通常由红外光源、红外摄像头和彩色摄像头组成,通过投射特定光模式(如红外条纹或点云)到场景中,再由摄像头捕获并分析计算深度信息。 该摄像头针对机器人开发设计,可用于导航、避障、物体识别和抓取等功能,提升机器人智能化水平。同时,它能够人工智能算法结合,借助深度学习等技术优化性能,实现对复杂环境的实时识别、跟踪和理解。 ROS(Robot Operating System)是一个广泛使用的开源机器人软件框架,提供工具和库,方便开发者编写控制机器人的软件,支持硬件抽象、消息传递和任务调度等功能。ORBBEC Dabai ProROS兼容,用户可通过ROS接口轻松集成摄像头,编写和运行针对摄像头数据的算法。 压缩包内的“SensorDriver_V4.3.0.17.exe”是ORBBEC Dabai Pro摄像头的驱动程序,版本号为4.3.0.17,安装后可在计算机上正确识别和使用摄像头。“OrbbecViewer_1.1.13_202207221538_Windows”是配套查看器软件,版本1.1.13,用于实时显示和测试摄像头捕捉的图像深度信息,便于调试和开发。 ORBBEC Dabai Pro是一款面向机器人和人工智能应用的高级双目光结构摄像头,结合3D感知
资源下载链接为: https://pan.quark.cn/s/2f7c1c4db4a5 最近在撰写论文过程中,深入研习了多本关于结构方程模型(SEM)以及 AMOS 软件运用的书籍,现将这些优质学习资源分享给大家,且附带相关数据。 《AMOS 研究方法》(荣泰生)这本书共 102 页,其中第 92 页的 “第 5 章 Amos 操作环境模型建立” 部分极具价值,对于初学者来说,能助力大家迅速掌握 Amos 的基础操作,是开启 Amos 学习之旅的优质篇章。 在熟悉了 “荣泰生” 版本的 Amos 教材后,强烈建议大家进一步研读邱皓政的《结构方程模型的原理应用》。这本书在中国轻工业出版社出版,是众多结构方程模型学习者心目中的经典必读之作,兼具理论深度实践指导性,非常值得推崇。它的一大特色是同时涵盖了 Lisrel、Amos、Mplus 这三种常用结构方程模型软件的具体操作流程以及源代码,从侧面彰显了作者在结构方程模型领域扎实的专业功底,其配套的 “数据包” 内容也极具参考价值。尤其在第 88 页的 “各种拟合数据的比较” 部分,清晰呈现了 RMSEA、GFI、NFI 等关键结构方程模型拟合数据指标的取值范围以及合适的判断标准,能让学习者快速理解 SEM 运行结果,为深入学习 SEM 打下坚实基础。 对于结构方程模型领域的新人而言,建议先阅读荣泰生的《AMOS 研究方法》,重点关注第 92 页的 “第 5 章 Amos 操作环境模型建立”,借此快速掌握 Amos 基本操作。在此基础上,再深入学习邱皓政的《结构方程模型的原理应用》,这样能够实现从 SEM 入门到逐步精通的系统学习过程。
资源下载链接为: https://pan.quark.cn/s/2f7c1c4db4a5 《保研资料大全》是一份助力学生保研的实用指南。其中,“各高校的往年信息”很关键,涵盖历年保研政策变化、名额分配、录取标准等,助学生了解各校要求偏好,制定申请策略;还可能含历年保研生背景分析,如专业、绩点、科研经历等,供学生参考。“导师信息”对保研至关重要,资料里有导师研究方向、科研成果、教学风格等,利于学生找到匹配导师,提前了解其背景,面试时展现理解和尊重。“导师重视素质”部分,会指出保研中导师看重的学术、创新、团队协作、语言表达等能力,学生可据此自我评估提升。“联系导师模板”是实用工具,好的沟通能力对保研很重要,精心设计的邮件模板能帮学生和导师首次接触时留下好印象。“个人简历模板”和“英文自我介绍”是展示个人的重要方式,清晰专业简历让导师快速了解基本信息亮点,流利英文自我介绍体现语言能力和自信,对有国际交流背景高校很重要。“各高校夏令营学长学姐经验总结”提供第一手经验,助学生避开前辈错误,掌握保研关键。“获取资源的方式”部分,包含找最新保研信息、参加学术活动、利用网络平台等方法,助学生拓宽信息渠道,提高保研成功率。这份资料全面覆盖保研各环节,从政策到导师选择,再到操作技巧,学生深入学习应用,能更自信应对保研挑战,提升成功几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值