SQLMesh 系列教程5- 詳解SQL模型

本文將詳細介紹 SQLMesh 的 SQL 模型組成要素及其在實際項目中的應用。SQLMesh 是一個強大的數據工程工具,其 SQL 模型由 MODEL DDL、預處理語句、主查詢、后處理語句以及可選的 ON VIRTUAL UPDATE 語句組成。我們將通過一個電商平臺每日銷售報告的實例,展示如何利用這些要素構建高效的數據管道。文章將逐步解析每個部分的作用,并說明如何通過 SQLMesh 實現增量更新和虛擬更新測試,幫助讀者掌握 SQLMesh 的核心功能及其在實際場景中的最佳實踐。

SQL模型概述

SQL模型是SQLMesh使用的主要模型類型。這些模型可以使用SQL或生成SQL的Python來定義。
在這里插入圖片描述

基于sql的定義,基于SQL的SQL模型定義是最常見的定義,它由以下部分組成:

  • MODEL DDL

    使用 MODEL 關鍵字定義模型的基本信息,包括模型名稱、目標表、分區策略等。這是 SQL 模型的入口點,用于聲明模型的元數據。

  • 可選的預處理語句(Pre-statements)

    在模型的主查詢之前執行的 SQL 語句。通常用于創建臨時表、設置變量或執行其他準備工作。

  • 單個查詢(Main Query)

    模型的核心部分,定義數據轉換邏輯。必須是一個單獨的 SELECT 查詢,用于生成目標表的數據。

  • 可選的后處理語句(Post-statements)

    在主查詢之后執行的 SQL 語句。通常用于清理臨時表、更新元數據或執行其他收尾工作。

  • 可選的 ON VIRTUAL UPDATE 語句

    用于定義在虛擬更新(Virtual Update)時的行為。虛擬更新是 SQLMesh 的一種機制,允許在不實際修改數據的情況下測試模型的更改。

這些模型的設計目的是讓你看起來像是在簡單地使用SQL,但它們可以針對高級用例進行定制。

要創建基于sql的模型,請在SQLMesh項目中的models/目錄(或models/的子目錄)中添加一個后綴為.sql的新文件。雖然文件名并不重要,但是習慣上使用模型名(不帶模式名)作為文件名。例如,包含sqlmesh_example.seed_model的模型文件,將被命名為seed_model.sql。

舉例:

-- This is the MODEL DDL, where you specify model metadata and configuration information.
MODEL (name db.customers,kind FULL,
);/*Optional pre-statements that will run before the model's query.You should NOT do things that cause side effects that could error out whenexecuted concurrently with other statements, such as creating physical tables.
*/
CACHE TABLE countries AS SELECT * FROM raw.countries;/*This is the single query that defines the model's logic.Although it is not required, it is considered best practice to explicitlyspecify the type for each one of the model's columns through casting.
*/
SELECTr.id::INT,r.name::TEXT,c.country::TEXT
FROM raw.restaurants AS r
JOIN countries AS cON r.id = c.restaurant_id;/*Optional post-statements that will run after the model's query.You should NOT do things that cause side effects that could error out whenexecuted concurrently with other statements, such as creating physical tables.
*/
UNCACHE TABLE countries;
  • 模型DDL

MODEL DDL用于指定關于模型的元數據,例如模型的名稱、類型、所有者、cron等。這應該是基于sql的模型文件中的首個語句。有關允許的屬性的完整列表,請參閱MODEL屬性。

  • 可pre/post-statements

可選的pre/post語句允許你分別在模型運行之前和之后執行SQL命令。

例如,pre/post語句可能會修改設置或創建表索引。但是,如果并發運行,請注意不要運行任何可能與另一個模型的執行沖突的語句,例如創建物理表。

pre/post 語句只是位于模型查詢之前/之后的標準SQL命令。它們必須以分號結束,如果存在后置語句,則模型查詢必須以分號結束。上面的例子包含了前置語句和后置語句。

Pre/post語句被求值兩次:當創建模型的表時,以及當計算其查詢邏輯時。多次執行語句可能會產生意想不到的副作用,因此可以根據SQLMesh的運行時階段有條件地執行語句。

上面示例中的pre/post語句將運行兩次,因為它們不受運行時階段的限制。

我們可以使用@IF宏操作符和@runtime_stage宏變量對后置語句進行條件調整,使其僅在模型查詢被評估后運行,如下所示:

MODEL (name db.customers,kind FULL,
);[...same as example above...]@IF(@runtime_stage = 'evaluating',UNCACHE TABLE countries
);

注意,@IF()宏中的SQL命令UNCACHE TABLE countries不以分號結束。相反,分號出現在@IF()宏的右括號之后。

  • 可選的on-virtual-update語句

可選的on-virtual-update語句允許你在虛擬更新完成后執行SQL命令。

例如,可以使用這些權限來授予虛擬層視圖的權限。這些SQL語句必須包含在ON_VIRTUAL_UPDATE_BEGIN;…;ON_VIRTUAL_UPDATE_END;

MODEL (name db.customers,kind FULL
);SELECTr.id::INT
FROM raw.restaurants AS r;ON_VIRTUAL_UPDATE_BEGIN; 
GRANT SELECT ON VIEW @this_model TO ROLE role_name;
JINJA_STATEMENT_BEGIN;     
GRANT SELECT ON VIEW {{ this_model }} TO ROLE admin;
JINJA_END;  
ON_VIRTUAL_UPDATE_END;

也可以在其中使用Jinja表達式,如上面的示例所示。這些表達式必須正確地嵌套在JINJA_STATEMENT_BEGIN;和JINJA_END;塊。

這些語句的表解析發生在虛擬層。這意味著表名,包括@this_model宏,被解析為它們的限定視圖名。例如,當在名為dev的環境中運行計劃時,db.customers@this_model將解析為db__dev.customers而不是物理表名。

  • 模型查詢

模型必須包含一個獨立的查詢,它可以是單個SELECT表達式,也可以是多個SELECT表達式與UNION、INTERSECT或EXCEPT操作符的組合。該查詢的結果將用于填充模型的表或視圖。

完整實例

實際應用場景

在一個電商平臺的數據分析項目中,該 SQL 模型可以用于:

  1. 每日銷售報告:每天自動生成銷售數據,供業務團隊分析。
  2. 增量更新:只處理當天的訂單數據,避免全量計算,提高效率。
  3. 虛擬更新測試:在部署前測試模型的更改,確保不會破壞現有數據管道。

以下是一個完整的 SQLMesh SQL 模型示例,結合上述實際應用場景:假設我們需要從原始訂單數據中生成每日銷售報告。

  • 原始數據表:raw_orders,包含訂單的詳細信息。
  • 目標數據表:daily_sales_report,按天匯總銷售數據。

SQL 模型腳本

-- MODEL DDL
MODEL (name db.daily_sales_report, -- 模型名稱和目標表kind INCREMENTAL_BY_TIME_RANGE ( -- 增量模型,按時間范圍更新time_column order_date),cron '@daily', -- 每天執行一次grain [order_date] -- 數據粒度
);-- 可選的預處理語句
-- 例如:創建一個臨時表來存儲當天的訂單數據
CREATE TEMPORARY TABLE temp_daily_orders AS
SELECT *
FROM raw_orders
WHERE order_date = @start_ds;-- 單個查詢(主查詢)
SELECTorder_date,SUM(quantity * price) AS total_sales, -- 計算總銷售額COUNT(DISTINCT order_id) AS total_orders, -- 計算總訂單數SUM(quantity * price) / COUNT(DISTINCT order_id) AS avg_order_value -- 計算平均訂單價值
FROM temp_daily_orders
GROUP BY order_date;-- 可選的后處理語句
-- 例如:刪除臨時表
DROP TABLE IF EXISTS temp_daily_orders;-- 可選的 ON VIRTUAL UPDATE 語句
ON VIRTUAL UPDATE {-- 在虛擬更新時,返回一個示例結果集SELECT'2023-10-01' AS order_date,1000.00 AS total_sales,10 AS total_orders,100.00 AS avg_order_value;
};

詳細說明

  1. MODEL DDL
    • name:定義模型的名稱和目標表(db.daily_sales_report)。
    • kind:指定模型的類型。這里使用 INCREMENTAL_BY_TIME_RANGE,表示這是按時間范圍更新的增量模型。
    • time_column:指定時間列(order_date),用于增量更新。
    • cron:定義模型的調度頻率(每天執行一次)。
    • grain:定義數據的粒度(按 order_date 聚合)。
  2. 預處理語句
    • 創建了一個臨時表 temp_daily_orders,用于存儲當天的訂單數據。
    • @start_ds 是 SQLMesh 提供的宏,表示當前處理的時間范圍起點。
  3. 主查詢
    • 從臨時表 temp_daily_orders 中查詢數據,按 order_date 聚合計算總銷售額、總訂單數和平均訂單價值。
  4. 后處理語句
    • 清理臨時表 temp_daily_orders,避免占用資源。
  5. ON VIRTUAL UPDATE
    • 在虛擬更新時,返回一個示例結果集,用于測試模型的輸出結構。

通過這種方式,SQLMesh 的 SQL 模型能夠清晰地定義數據轉換邏輯,同時支持增量更新和虛擬更新,非常適合復雜的數據工程場景。
在這里插入圖片描述

最后總結

本文深入探討了 SQLMesh 的 SQL 模型組成要素,包括 MODEL DDL、預處理語句、主查詢、后處理語句以及 ON VIRTUAL UPDATE 語句。通過一個電商平臺每日銷售報告的實例,我們展示了如何利用 SQLMesh 構建高效、可維護的數據管道。SQLMesh 的增量更新機制和虛擬更新測試功能,極大地提升了數據工程的靈活性和可靠性。無論是處理大規模數據還是優化數據工作流,SQLMesh 都提供了強大的工具和方法,幫助團隊實現數據驅動決策。希望本文能為讀者在實際項目中應用 SQLMesh 提供有價值的參考。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70284.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek 接入PyCharm實現AI編程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在當今數字化時代,AI編程助手已成為提升開發效率的利器。DeepSeek作為一款強大的AI模型,憑借其出色的性能和開源免費的優勢,成為許多開發者的首選。今天,就讓我們一起探索如何將DeepSeek接入PyCharm,實現高效、智…

從駕駛員到智能駕駛:汽車智能化進程中的控制與仿真技術

在汽車技術持續演進的歷程中,人類駕駛員始終是一個極具研究價值的智能控制系統“原型”。駕駛員通過視覺感知、行為決策與操作執行的閉環控制,將復雜的駕駛任務轉化為車輛的實際動作,同時動態適應道路環境的變化。這一過程不僅體現了高度的自…

Spring Boot項目的基本設計步驟和相關要點介紹

以下是一個關于Spring Boot項目的基本設計步驟和相關要點介紹,我們以一個簡單的示例應用——員工管理系統為例進行說明: 一、項目概述 員工管理系統旨在實現對公司員工信息的有效管理,包括員工基本信息錄入、查詢、更新以及刪除等功能。通過Spring Boot框架來快速搭建后端…

【Java】泛型與集合篇(一)

泛型與集合(一) 泛型泛型的核心作用泛型類型(類)定義與使用類型參數命名約定泛型方法定義與調用與泛型類的區別通配符上界通配符下界通配符有界類型參數類型擦除集合框架核心接口Collection 接口Map 接口Collection 接口操作的常用方法基本操作批量操作數組操作流操作方法L…

HarmonyOS組件之Tabs

Tabs 1.1概念 Tabs 視圖切換容器,通過相適應的頁簽進行視圖頁面的切換的容器組件每一個頁簽對應一個內容視圖Tabs擁有一種唯一的子集元素TabContent 1.2子組件 不支持自定義組件為子組件,僅可包含子組件TabContent,以及渲染控制類型 if/e…

華為FusionCompute虛擬化平臺

一、華為FusionCompute虛擬化套件介紹 華為FusionCompute虛擬化套件是業界領先的虛擬化解決方案,能夠幫助客戶帶來如下的價值,從而大幅提升數據中心基礎設施的效率。 幫助客戶提升數據中心基礎設施的資源利用率;幫助客戶成倍縮短業務上線周期…

使用apt-rdepends制作軟件離線deb安裝包

使用apt-rdepends制作軟件離線deb安裝包 除基礎軟件外,還要獲取軟件依賴包。 依賴包工具安裝 apt-get install apt-rdependsapt-rdepends工具使用 使用apt-rdepends工具,遞歸方式分析軟件依賴,下載軟件包本體,和依賴包。制作時…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析⑩】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase10 作者:車端域控測試工程師 更新日期:2025年02月18日 關鍵詞:UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-010測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

什么是Scaling Laws(縮放定律);DeepSeek的Scaling Laws

什么是Scaling Laws(縮放定律) Scaling Laws(縮放定律)在人工智能尤其是深度學習領域具有重要意義,以下是相關介紹及示例: 定義與內涵 Scaling Laws主要描述了深度學習模型在規模(如模型參數數量、訓練數據量、計算資源等)不斷擴大時,模型性能與這些規模因素之間的…

大一計算機的自學總結:前綴樹(字典樹、Trie樹)

前言 前綴樹&#xff0c;又稱字典樹&#xff0c;Trie樹&#xff0c;是一種方便查找前綴信息的數據結構。 一、字典樹的實現 1.類描述實現 #include <bits/stdc.h> using namespace std;class TrieNode { public:int pass0;int end0;TrieNode* nexts[26]{NULL}; };Tri…

【存儲中間件API】MySQL、Redis、MongoDB、ES常見api操作及性能比較

常見中間件api操作及性能比較 ?? MySQL crud操作?? maven依賴?? 配置?? 定義實體類?? 常用api ?? Redis crud操作?? maven依賴?? 配置?? 常用api ?? MongoDB crud操作?? maven依賴?? 配置文件?? 定義實體類?? MongoDB常用api ?? ES crud操作 ??…

51單片機入門_10_數碼管動態顯示(數字的使用;簡單動態顯示;指定值的數碼管動態顯示)

接上篇的數碼管靜態顯示&#xff0c;以下是接上篇介紹到的動態顯示的原理。 動態顯示的特點是將所有位數碼管的段選線并聯在一起&#xff0c;由位選線控制是哪一位數碼管有效。選亮數碼管采用動態掃描顯示。所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選&#xff…

C++入門《類和對象》之《運算符重載》詳解|成員函數重載/非成員函數重載

C 中&#xff0c;運算符重載是一種特殊的函數&#xff0c;它允許程序員為自定義的數據類型&#xff08;如類和結構體&#xff09;重新定義運算符的行為&#xff0c;使得這些運算符能夠像處理內置數據類型一樣處理自定義類型的數據。下面將從多個方面詳細講解 C 里的運算符重載。…

Salesforce 檢索Layout的設定

做了許多Object&#xff0c;卻想不起來怎么設置我的Listview的項目了。 問題&#xff1a; salesforce 最近參照したオブジェクト 表示項目を変更したいですが、「検索レイアウト」の選択メニューが該當オブジェクトのオブジェクトマネージャーから出てないです。 解決方法&am…

SECS/GEM300應用案例參考

GEM300 是一種用于半導體制造領域的通信協議標準&#xff0c;主要用于支持 300mm 晶圓制造的自動化生產。以下是 GEM300 的一些具體應用案例&#xff1a; 1. 半導體設備集成 設備制造商的應用&#xff1a;廣州金南瓜科技有限公司通過 GEM300 SDK&#xff0c;幫助國內多個半導體…

win10系統上的虛擬機安裝麒麟V10系統提示找不到操作系統

目錄預覽 一、問題描述二、原因分析三、解決方案四、參考鏈接 一、問題描述 win10系統上的虛擬機安裝麒麟V10系統提示找不到操作系統&#xff0c;報錯&#xff1a;Operating System not found 二、原因分析 國產系統&#xff0c;需要注意的點&#xff1a; 需要看你的系統類…

情書網源碼 情書大全帝國cms7.5模板

源碼介紹 帝國cms7.5仿《情書網》模板源碼&#xff0c;同步生成帶手機站帶采集。適合改改做文學類的網站。 效果預覽 源碼獲取 情書網源碼 情書大全帝國cms7.5模板

C語言題目:鏈表數據求和操作

題目描述 讀入10個復數&#xff0c;建立對應鏈表&#xff0c;然后求所有復數的和。 輸入格式 無 輸出格式 無 樣例輸入 1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 2 3 3 1 1 樣例輸出 2323i 代碼功能概述 createNode 函數&#xff1a; 創建一個包含 10 個復數節點的鏈表。 每個…

STM32 ADC介紹(硬件原理篇)

目錄 背景 AD轉換器 采樣與保持 量化 編碼 AD轉換器轉換原理 DA轉換原理 AD轉換原理 1.逐次逼近型AD轉換器 2.并聯比較型AD轉換器 編碼器 同步D觸發器和邊沿D觸發器 基本RS觸發器 同步RS觸發器 同步D觸發器 邊沿型D觸發器&#xff08;維持-阻塞D觸發器&#xff…

公網遠程家里局域網電腦過程詳細記錄,包含設置路由器。

由于從校內遷居小區,校內需要遠程控制訪問小區內個人電腦,于是早些時間剛好自己是電信寬帶,可以申請公網ipv4不需要花錢,所以就打電話直接申請即可,申請成功后訪問光貓設備管理界面192.168.1.1,輸入用戶名密碼登錄超管(密碼是網上查下就有了)設置了光貓為橋接模式,然后…