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.mzph.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,输入用户名密码登录超管(密码是网上查下就有了)设置了光猫为桥接模式,然后…