当前位置: 首页 > article >正文

SQLMesh系列教程:SQLMesh虚拟数据环境

各种工具都已将软件工程实践引入到数据工程中,但仍有差距存在,尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地,解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中,我将对 SQLMesh 进行简要介绍,分享有关其功能和潜在影响的见解。

安装SQLMesh

上文我们已经创建了示例SQLMesh项目,你可以使用它来学习本文中的示例。

python3 -m venv .venv
source .venv/bin/activate

# SQLMesh uses extras to install specific modules that are used in the project. 
# This allows you to quickly extend SQLMesh with the desired capabilities 
# and at the same time ensure a lean footprint.
pip install "sqlmesh[postgres,web]"

项目结构介绍

如果你以前使用过dbt,那么您会对SQLMesh项目框架感到熟悉。开发人员已经确保SQLMesh与dbt向后兼容,允许现有dbt项目的无缝迁移。

  • config.yml - 在您的项目的根目录下,您会发现一个简洁明了的基于 YAML 格式的 SQLMesh 配置文件。此文件内容简短,主要侧重于设置网关(多个网关时)以及定义模型的默认 SQL 语言。
  • Audits - 验证数据是一项至关重要的功能,它应当让数据的生产者和消费者都确信数据符合预期。dbt 也提供了类似的功能,称为“数据测试”。
  • macros - 现在被视为标准的一项功能是能够通过编程式的函数(例如 if 语句、for 循环和筛选表达式)增强静态 SQL 语句。这种功能通常通过宏系统来实现,比如在 dbt 中使用 Jinja,这是一个流行的基于 Python 的模板引擎。SQLMesh 也支持 Jinja,但更进一步提供了自己的宏系统。与简单的字符串替换不同,它解释 SQL 语义,使其成为更强大和灵活的工具。在我看来,这种新增的能力不仅因其优雅的语法而值得称赞,还因其强大的功能而如此,值得肯定。
  • Models- SQLMesh 在定义数据模型方面与众不同的地方在于其如何管理元数据。它并非像其他工具那样使用单独的 YAML 文件,而是直接在 SQL 代码中定义元数据。在我的测试中,我发现这种方法特别直观且对开发者友好,使得建模过程更加顺畅和高效。
    • 原始数据集(Seeds) - 尽管这种情况可能不常见,但我们都知道它迟早会发生的:整合基于 CSV 或 JSON 的数据集。为了解决这个问题,SQLMesh 与 dbt 一样,包含了对原始数据集的支持。在 SQLMesh 中,数据集文件存储在指定的文件夹中,然后在 Models 文件夹中定义相应的模型。
  • 测试(tests) - 我完全赞同 SQLMesh 在为数据建模实现单元测试方面的做法。它并非采用传统的审计方式,而是侧重于一种直接的输入与输出对比检查,这种检查能够快速且轻松地执行,且无需依赖大量资源。这种方法不仅加快了反馈流程,还为数据工程师提供了实用的工具,使他们能够在数据的背景下采用诸如测试先行开发之类的概念。自 1.8 版本起,dbt 还提供了“单元测试”。

SQLMesh核心机制

这是SQLMesh的另一个真正优势所在。开发人员已经解决了数据集开发中的一个关键挑战:管理数据模型的多个版本。SQLMesh引入了虚拟数据环境的概念,它在两个层面上运行:物理和虚拟。

SQL Mesh Engine
  ├── 物理层:数据库仓库 + 快照存储
  ├── 虚拟层:环境隔离视图 + 版本映射
  ├── 元数据引擎:指纹计算 + 依赖解析
  └── 测试引擎:快照验证 + 自动回滚

在这里插入图片描述

在物理层面,当一个新项目启动并首次执行计划时,会为每个模型创建一个快照(版本 1)。在所有测试和审计成功完成后,虚拟层面就会发挥作用。会为相应的环境创建一个视图,指向最新的快照。这种方法确保了有效的版本管理以及无缝的更新。

# sqlmesh plan [environment name]
# if you provide no name it will by default use "prod" as environment.
sqlmesh plan

当显式指定环境时,例如“dev”,流程将为dev创建虚拟层,并将视图指向模型的最新快照版本。

sqlmesh plan dev

当对模型进行修改时,SQLMesh 会采用一套复杂的指纹识别系统,该系统不仅会分析模型本身,还会分析整个依赖树。这确保了所有受影响的模型都得到了验证。如果该变更首先在“开发”环境中应用,那么在成功测试和审核后会创建一个新的快照版本,并且“开发”环境中的视图指针会被更新到新的版本。
如果出现操作错误,只需执行一个命令即可轻松回滚到之前的快照版本,无需重新处理数据。这真是太巧妙了!

sqlmesh rollback

如果你想知道那些不再使用的旧快照会怎样处理,那么 SQLMesh 提供了一个解决方案:一个名为“Janitor”的垃圾回收器。此进程会在每次计划执行时自动运行,或者在需要时通过 CLI 命令手动触发运行。

sqlmesh janitor

最后总结

为了提升数据工程的质量,采用成熟的软件工程实践和原则至关重要。SQLMesh 在这方面取得了显著进展,引入了诸如虚拟数据环境等创新概念。我还赞赏其通过单元测试方法来提高测试效率的专注点。在实际操作中,我发现以 YAML 格式定义模拟对象并快速有效地验证 SQL 模型的逻辑特别方便,而且无需依赖大量资源。

然而,就像任何进入成熟市场的新竞争者一样,SQLMesh 必须在行业领导者 dbt 的竞争中证明自己的实力。尽管我认为 SQLMesh 具有强大的潜力能够确立稳固的地位,但 dbt 的大量使用者是否会转向 SQLMesh 还有待观察。话虽如此,我建议你仔细研究一下 SQLMesh 的理念,并评估其可能为组织带来的价值。


http://www.kler.cn/a/592650.html

相关文章:

  • 台式机电脑组装---电源
  • 【C++】STL(1) - 序列容器
  • Java设计模式之模板方法模式(Template Method Pattern)
  • Redis 三主三从集群部署的完整方案
  • ASP3605同步降压调节器——满足汽车电子严苛要求的电源芯片方案
  • 进程间通信(1)——管道
  • 数据结构知识点1
  • excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果输出到json文件
  • 使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)
  • 【开源宝藏】30天学会CSS - DAY3 第三课 滑动文本+变色
  • mysql 索引的使用
  • mapbox-gl源码中解析style加载地图过程详解
  • 线性规划的标准形式
  • Golang开发
  • 【Dive Into Stable Diffusion v3.5】1:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练
  • 使用 Wireshark 在 Ubuntu 22.04 上抓包分析网络流量
  • 危化品经营单位考试:从基础夯实到能力提升的进阶之路​
  • Docker 存储
  • 麒麟服务器操作系统Node.js环境部署手册
  • 当今前沿技术:改变生活的创新趋势