深入理解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,)
);SELECTid::INT,name::STRING,price::DOUBLE,updated_at::TIMESTAMP
FROMstg.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])
);SELECTid::INT,name::STRING,price::DOUBLE,
FROMstg.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模型,可以确保数据仓库既能反映当前状态,又能保留完整的历史变更记录,为业务分析提供坚实的数据基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909973.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何保证MySQL与Redis数据一致性方案详解

目录 一、数据不一致性的根源 1.1 典型不一致场景 1.2 关键矛盾点 二、一致性保障策略 2.1 基础策略&#xff1a;更新数据库与缓存的时序选择 &#xff08;1&#xff09;先更新数据库&#xff0c;再删除缓存 &#xff08;2&#xff09;先删缓存&#xff0c;再更新数据库…

JSON-RPC 2.0 与 1.0 对比总结

JSON-RPC 2.0 与 1.0 对比总结 一、核心特性对比 特性JSON-RPC 1.0JSON-RPC 2.0协议版本标识无显式版本字段&#xff0c;依赖 method 和参数结构区分[5]。强制包含 "jsonrpc": "2.0" 字段&#xff0c;明确版本[1][4]。参数结构仅支持索引数组&#xff08;…

C# 事件详解

C# 事件 一、事件二、事件的应用三、事件的自定义声明 一、事件 定义&#xff1a;“a thing that happens, especially something important” / “能够发生的什么事情”角色&#xff1a;使对象或类具备通知能力的成员使用&#xff1a;用于对象或类间的动作协调与信息传递事件…

青少年编程与数学 01-011 系统软件简介 24 Kubernetes 容器编排系统

青少年编程与数学 01-011 系统软件简介 24 Kubernetes 容器编排系统 一、历史沿革&#xff08;一&#xff09;起源1. Google 内部起源 &#xff08;二&#xff09;开源后的关键事件&#xff08;三&#xff09;社区治理 二、技术架构&#xff08;一&#xff09;分层设计哲学&…

[C++] : 谈谈IO流

C IO流 引言 谈到IO流&#xff0c;有些读者可能脑海中第一个想到的C程序员的最基础的std::cout &#xff0c; std::cin两个类的使用&#xff0c;对的&#xff0c;这个就是一个典型的IO流&#xff0c;所以逆天我们这篇文章会基于C IO流的原理和各种应用场景进行深入的解读。 C…

Kafka 3.0零拷贝技术全链路源码深度剖析:从发送端到日志存储的极致优化

在分布式消息系统领域&#xff0c;Kafka凭借高吞吐、低延迟的特性成为行业首选。而零拷贝技术作为Kafka性能优化的核心引擎&#xff0c;贯穿于消息从生产者发送、Broker接收存储到消费者读取的全生命周期。本文基于Kafka 3.0版本&#xff0c;深入源码层面&#xff0c;对零拷贝技…

利益驱动机制下开源AI智能名片链动2+1模式与S2B2C商城小程序的商业协同研究

摘要&#xff1a;在数字经济时代&#xff0c;利益驱动作为用户行为激励的核心逻辑&#xff0c;正通过技术创新实现模式升级。本文基于“利益驱动”理论框架&#xff0c;结合“开源AI智能名片链动21模式S2B2C商城小程序”的技术架构&#xff0c;系统分析物质利益&#xff08;返现…

pytest的前置后置条件

1. setUp()和tearDown() setup()函数主要是进行测试前的初始化工作&#xff0c;比如&#xff1a;在接口测试前面做一些前置的参数赋值&#xff0c;数据库操作等等。 teardown()函数是测试后的清除工作&#xff0c;比如&#xff1a;参数还原或销毁&#xff0c;数据库的还原恢复…

Python 自动化运维与DevOps实践

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 基础设施即代码(IaC) 使用Fabric执行远程命令 python 复制 下载 from fabric import Connectiondef deploy_app():# 连接到远程服务器with Connection(web-server.example.com, userdeploy,…

css3 文本效果(text-shadow、text-overflow、word-wrap、word-break)文本阴影、文本换行、文本溢出并隐藏显示省略号

1. 文本阴影&#xff08;text-shadow&#xff09; 1.1 基本语法 text-shadow: h-shadow v-shadow blur-radius color;参数说明&#xff1a; h-shadow&#xff1a;必需。水平阴影的位置。允许负值。 正值&#xff1a;向右偏移负值&#xff1a;向左偏移 v-shadow&#xff1a;必…

在Kibana上新增Elasticsearch生命周期管理

技术文章大纲&#xff1a;在Kibana上新增Elasticsearch生命周期管理 引言 Elasticsearch索引生命周期管理&#xff08;ILM&#xff09;是管理索引从创建到删除全周期的核心工具。通过Kibana界面配置ILM策略&#xff0c;可以自动化处理索引的滚动、收缩、冻结和删除等操作&…

从零开始构建Python聊天机器人:整合NLP与深度学习

引言 在人工智能快速发展的今天&#xff0c;聊天机器人已经成为企业与用户交互的重要工具。从客户服务到信息查询&#xff0c;从个人助手到教育辅助&#xff0c;聊天机器人的应用场景越来越广泛。构建一个智能、高效的聊天机器人不仅需要了解自然语言处理&#xff08;NLP&…

光谱相机的多模态成像技术详解

一、技术架构与工作原理‌ 多模态成像通过‌同步集成多种光谱成像技术‌&#xff08;如高光谱多光谱热成像&#xff09;&#xff0c;构建“空间-光谱-时间”三维数据立方体&#xff0c;实现物质成分与动态过程的协同感知。核心架构包含&#xff1a; ‌分光系统‌ ‌液晶可调…

Spring Boot多数据源切换:三种实现方式详解与实战

在复杂业务系统中&#xff0c;多数据源切换已成为必备技能。本文将深入剖析三种主流实现方案&#xff0c;带你从入门到精通&#xff01; 一、多数据源应用场景 读写分离&#xff1a;主库负责写操作&#xff0c;从库处理读请求 多租户系统&#xff1a;不同租户使用独立数据库 …

Kafka性能压测报告撰写

在大数据生态体系中&#xff0c;Kafka以其卓越的高吞吐、低延迟特性&#xff0c;成为消息队列领域的中流砥柱。然而&#xff0c;随着业务规模不断扩张&#xff0c;数据流量日益激增&#xff0c;Kafka的性能表现直接关乎业务系统的稳定运行与效率提升。通过科学严谨的性能压测&a…

使用DevEco Testing快速创建HarmonyOS5单元测试

1.测试环境准备 确保已安装DevEco Studio 5.0在module的build.gradle添加依赖&#xff1a; dependencies {testImplementation org.junit.jupiter:junit-jupiter:5.8.2ohosTestImplementation com.huawei.ohos.testkit:runner:1.0.0.200 }2.创建测试类&#xff08;示例测试计…

开源物联网(IoT)平台对比

一些 开源物联网&#xff08;IoT&#xff09;平台&#xff0c;它们广泛应用于设备管理、数据采集、远程监控和边缘计算等场景&#xff1a; &#x1f31f; 主流开源物联网平台 平台描述技术栈许可证ThingsBoard功能丰富&#xff0c;支持设备管理、遥测数据收集、规则引擎、告警…

插值与模板字符串

背景。表单渲染需要获取对象中属性进行赋值操作。 插值错误使用。以下方举例。其中的placeholder不能被正确渲染。因为Vue 不会解析 {{ }} 在属性中的内容&#xff1b;如果这样写编译会出问题&#xff0c;而且比较难找出是哪的问题 模板字符串。正确做法时使用。模板字符串用…

Luckfox Pico Pi RV1106学习<4>:RV1106的帧率问题

Luckfox Pico Pi RV1106学习&#xff1c;4&#xff1e;&#xff1a;RV1106的帧率问题 1. 背景2. 问题 1. 背景 接上篇。我在应用中创建3个线程&#xff1a; CAM线程&#xff0c;使用V4L2驱动&#xff0c;从 /dev/video11 获取图像。ENC线程&#xff0c;使用硬件编码器&#x…

内测分发平台应用的异地容灾和负载均衡处理和实现思路?

在软件开发过程中&#xff0c;内测分发平台扮演着至关重要的角色。它不仅帮助开发者将应用程序传播给内部测试人员&#xff0c;还负责收集反馈、跟踪错误并改进产品。然而&#xff0c;为了确保一个平稳、连贯的内测过程&#xff0c;对内测分发平台实施异地容灾和负载均衡机制是…