深入理解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
英文地址,請注明出處:http://en.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;對內測分發平臺實施異地容災和負載均衡機制是…