本文将详细介绍 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 when
executed 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 explicitly
specify the type for each one of the model's columns through casting.
*/
SELECT
r<