SQLMesh 模型选择指南:优化大型项目的模型更新
在处理大型 SQLMesh 项目时,模型之间的依赖关系可能会变得非常复杂。为了更有效地管理这些项目,SQLMesh 提供了一种模型选择机制,允许用户有针对性地选择需要更新的模型。本文将详细介绍如何使用 SQLMesh 的模型选择功能来优化项目更新过程。
背景
SQLMesh 是一个用于数据集成和转换的工具,它能够自动检测本地版本与部署环境之间的差异,并在应用计划时回填直接修改的模型及其下游受影响的子模型。然而,在大型项目中,单个模型的更改可能会影响许多下游模型,导致评估和回填过程耗时较长。在这种情况下,用户可能只需要关注部分模型的更改结果,而不必回填所有受影响的模型。
模型选择语法
SQLMesh 的模型选择通过 --select-model
参数实现。选择可以以多种方式指定:
-
单个模型名称:例如
example.incremental_model
。 -
多个模型名称:可以通过重复 --select-model 参数来指定多个模型名称,例如:
sqlmesh plan --select-model "example.incremental_model" --select-model "example.full_model"
-
通配符:使用星号 * 来选择多个模型。例如:
"example.seed*"
将匹配example.seed_cities
和example.seed_states
。"example.*l_model"
将匹配example.incremental_model
和example.full_model
。
-
标签选择器:使用 tag:tag_name 语法来选择具有特定标签的所有模型。例如:
"tag:my_tag"
将选择所有带有my_tag
标签的模型。- 假设所有种子模型都有
seed
标签,所有增量模型都有incremental
标签,则"tag:seed"
将匹配所有种子模型,而"tag:incremental"
将匹配所有增量模型。
上游/下游指示符
默认情况下,只有直接更改的模型会被包含在计划中。可以使用加号 +
来选择模型的上游或下游模型:
- 上游模型:在选择的开始处使用加号,例如
+example.incremental_model
将包括incremental_model
的上游模型seed_model
。 - 下游模型:在选择的末尾使用加号,例如
example.incremental_model+
将包括incremental_model
的下游模型full_model
。
上游/下游指示符可以与通配符一起使用,以实现更精细的选择。例如:
--select-model "+example.*l_model" # 包括所有三个模型:example.incremental_model, example.seed_model, example.full_model
回填
SQLMesh 默认会回填计划中所有直接和间接修改的模型。在大型项目中,这可能会非常耗时。可以使用 --backfill-model
参数来限制需要回填的下游模型,该参数使用与 --select-model
相同的选择语法。
--select-model
确定哪些直接修改的模型被包含在计划中。--backfill-model
确定哪些模型由计划进行回填。
注意,如果同时指定了 --select-model
和 --backfill-model
选项,单个模型可能受到两个选项的影响。例如,如果模型 test_model
不被 --select-model
选择,但它是某个 --backfill-model
模型的上游,则其现有版本将被回填。
示例
我们将使用 SQLMesh 的 sushi 示例项目来演示 --select-model
和 --backfill-model
的使用。该项目位于 SQLMesh GitHub 仓库的 examples/sushi
目录中。
无选择
如果不选择特定模型,SQLMesh 将包括两个直接修改的模型和四个间接修改的模型:
sqlmesh plan dev
# 输出省略
Differences from the `prod` environment:
Models: Directly Modified: sushi.order_items sushi.items
Indirectly Modified: sushi.waiter_revenue_by_day sushi.customer_revenue_by_day sushi.customer_revenue_lifetime sushi.top_waiters
选择特定模型
仅选择 sushi.order_items
sqlmesh plan dev --select-model "sushi.order_items"
# 输出省略
Differences from the `prod` environment:
Models: Directly Modified: sushi.order_items
Indirectly Modified: sushi.waiter_revenue_by_day sushi.customer_revenue_by_day sushi.customer_revenue_lifetime sushi.top_waiters
选择 sushi.order_items
及其上游模型
sqlmesh plan dev --select-model "+sushi.order_items"
# 输出省略
Differences from the `prod` environment:
Models: Directly Modified: sushi.items sushi.order_items
Indirectly Modified: sushi.top_waiters sushi.customer_revenue_lifetime sushi.waiter_revenue_by_day sushi.customer_revenue_by_day
选择 sushi.items
及其下游模型
sqlmesh plan dev --select-model "sushi.items+"
# 输出省略
Differences from the `prod` environment:
Models: Directly Modified: sushi.items sushi.order_items
Indirectly Modified: sushi.waiter_revenue_by_day sushi.customer_revenue_lifetime sushi.customer_revenue_by_day sushi.top_waiters
使用通配符选择 sushi.*items
sqlmesh plan dev --select-model "sushi.*items"
# 输出省略
Differences from the `prod` environment:
Models: Directly Modified: sushi.order_items sushi.items
Indirectly Modified: sushi.waiter_revenue_by_day sushi.top_waiters sushi.customer_revenue_by_day sushi.customer_revenue_lifetime
回填示例
无回填选择
sqlmesh plan dev
# 输出省略
Models needing backfill (missing dates):
sushi__dev.items: 2023-12-01 - 2023-12-07
sushi__dev.order_items: 2023-12-01 - 2023-12-07
sushi__dev.customer_revenue_by_day: 2023-12-01 - 2023-12-07
sushi__dev.customer_revenue_lifetime: 2023-12-01 - 2023-12-07
sushi__dev.waiter_revenue_by_day: 2023-12-01 - 2023-12-07
sushi__dev.top_waiters: 2023-12-01 - 2023-12-07
仅回填 sushi.waiter_revenue_by_day
sqlmesh plan dev --backfill-model "sushi.waiter_revenue_by_day"
# 输出省略
Models needing backfill (missing dates):
sushi__dev.items: 2023-12-04 - 2023-12-10
sushi__dev.order_items: 2023-12-04 - 2023-12-10
sushi__dev.waiter_revenue_by_day: 2023-12-04 - 2023-12-10
通过使用 SQLMesh 的模型选择功能,用户可以更灵活地管理大型项目的更新过程,从而提高效率和准确性。希望本文能帮助你更好地利用这一功能!