SQLMesh 系列教程4- 详解模型特点及模型类型

news2025/2/23 3:56:30

SQLMesh 作为一款强大的数据建模工具,以其灵活的模型设计和高效的增量处理能力脱颖而出。本文将详细介绍 SQLMesh 模型的特点和类型,帮助读者快速了解其强大功能。我们将深入探讨不同模型类型(如增量模型、全量模型、SCD Type 2 等)的适用场景和优势,并通过实际示例展示如何利用这些模型高效加载数据。无论你是数据工程师还是数据科学家,SQLMesh 都能为你提供强大的支持。让我们一起探索 SQLMesh 的魅力,解锁高效数据处理的新可能!

SQLMesh 模型特点

SQLMesh 支持的数据模型具有以下特点,这些特点使得 SQLMesh 在数据建模和数据处理方面非常灵活且高效:

1. 灵活性

  • 多种模型类型:SQLMesh 支持多种模型类型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_UNIQUE_KEYFULLVIEWSCD_TYPE_2 等),每种模型类型都有其特定的用途和适用场景。这种多样性使得用户可以根据数据的特性和业务需求选择最合适的数据加载和处理方式。
  • 可配置性:每种模型类型都可以通过配置参数(如时间列、唯一键、分区键等)进行定制,以满足特定的业务逻辑和性能要求。

2. 增量处理能力

  • 增量加载:SQLMesh 的增量模型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_UNIQUE_KEY)能够根据时间范围或唯一键进行增量处理,只处理新增或更新的数据,从而显著节省计算资源和时间。
  • 动态时间范围:增量模型支持动态时间范围过滤(通过 @start_date@end_date 等宏变量),能够自动处理时间范围内的数据,减少不必要的计算。

3. 高效性和性能优化

  • 增量更新:增量模型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_PARTITION)通过只处理缺失或更新的数据,避免了全量数据的重新计算,从而提高了处理效率。
  • 分区支持:某些模型类型(如 INCREMENTAL_BY_PARTITION)支持分区键,能够按分区键批量处理数据,进一步优化性能。
  • 自动优化:SQLMesh 会自动在模型查询中添加时间范围过滤器,防止数据泄漏,并减少不必要的数据处理。

4. 数据一致性和准确性

  • 时间列管理:SQLMesh 强调时间列的重要性,要求时间列使用 UTC 时间,以确保与调度器和宏变量的正确交互。这种标准化的时间管理方式有助于避免时区相关错误。
  • 幂等性:对于某些模型类型(如 INCREMENTAL_BY_TIME_RANGE),SQLMesh 推荐确保查询的幂等性,以避免数据重述时出现意外结果。
  • 数据版本管理:SCD Type 2 模型通过 valid_fromvalid_to 列记录数据的历史版本,支持对数据变更的跟踪和回溯,确保数据的完整性和准确性。

5. 易用性和可维护性

  • SQL 优先:SQLMesh 使用标准 SQL 语法定义模型,使得数据工程师可以使用熟悉的 SQL 语言进行建模,而无需学习新的语言或框架。
  • 模块化和重用EMBEDDED 模型允许将公共逻辑作为子查询注入到其他模型中,提高了代码的复用性和可维护性。
  • 自动管理:SQLMesh 自动处理模型的依赖关系和执行顺序,减少了手动维护的复杂性。

6. 支持复杂业务逻辑

  • 自定义逻辑:SQLMesh 支持复杂的 SQL 查询和自定义逻辑(如 when_matched 表达式),能够满足复杂的业务需求。
  • 动态过滤:通过 merge_filter 等特性,用户可以动态地过滤数据,避免全表扫描,进一步优化性能。

7. 与主流数据库和引擎的兼容性

  • 广泛支持:SQLMesh 支持多种数据库和计算引擎(如 BigQuery、Databricks、Snowflake、Postgres、Redshift 等),并且针对不同引擎提供了优化的实现。
  • 适应性强:SQLMesh 的模型定义和配置方式能够适应不同数据库的语法和特性,提供了良好的跨平台兼容性。

8. 数据历史和变更管理

  • SCD Type 2 支持:SQLMesh 提供了强大的 SCD Type 2 模型支持,能够记录数据的历史变更,支持按时间查询特定版本的数据,满足数据仓库中对历史数据管理的需求。
  • 硬删除处理:SCD Type 2 模型支持硬删除的处理逻辑,用户可以根据需求选择是否记录删除的时间点,从而在数据历史中保留或忽略删除操作。

9. 可扩展性和可定制性

  • 扩展性:SQLMesh 的模型定义和执行机制支持大规模数据处理和复杂的 ETL 流程。
  • 可定制性:用户可以通过自定义宏、配置参数和模型类型来扩展 SQLMesh 的功能,以满足特定的业务需求。

10. 数据安全和完整性

  • 数据重述保护:某些模型类型(如 INCREMENTAL_BY_UNIQUE_KEYSCD_TYPE_2)默认禁用部分数据重述,以防止意外数据丢失。
  • 数据完整性检查:SQLMesh 提供了机制来确保数据在加载和更新过程中的完整性,避免数据丢失或重复。

这些特点使得 SQLMesh 成为一个强大且灵活的数据建模工具,能够满足从简单到复杂的数据处理需求,同时优化性能和资源使用。

SQLMesh 模型类型

SQLMesh 支持以下几类模型,每种模型都有其特定的用途和配置方式。以下是模型的分类及示例说明:
在这里插入图片描述

1. INCREMENTAL_BY_TIME_RANGE

  • 用途:基于时间范围增量加载数据,适用于事件、日志或事务等不可变数据。

  • 特点:仅处理缺失的时间区间,节省时间和成本。

  • 要求:必须指定时间列(time_column),并且查询中需要包含 WHERE 子句以过滤时间范围。

  • 示例

    sql复制

    MODEL (
      name db.events,
      kind INCREMENTAL_BY_TIME_RANGE (
        time_column event_date
      )
    );
    SELECT
      event_date::TEXT as event_date,
      event_payload::TEXT as payload
    FROM raw_events
    WHERE
      event_date BETWEEN @start_ds AND @end_ds;
    

2. INCREMENTAL_BY_UNIQUE_KEY

  • 用途:基于唯一键增量加载数据,适用于需要根据唯一键更新或插入数据的场景。

  • 特点:新数据会根据唯一键进行插入或更新,支持复合键。

  • 示例

    sql复制

    MODEL (
      name db.employees,
      kind INCREMENTAL_BY_UNIQUE_KEY (
        unique_key name
      )
    );
    SELECT
      name::TEXT as name,
      title::TEXT as title,
      salary::INT as salary
    FROM raw_employees;
    

3. FULL

  • 用途:每次运行时完全刷新数据,适用于较小的数据集或无需保留历史记录的聚合表。

  • 特点:简单易用,但不适合大数据集,因为每次运行都会重新计算所有数据。

  • 示例

    sql复制

    MODEL (
      name db.salary_by_title_agg,
      kind FULL
    );
    SELECT
      title,
      AVG(salary)
    FROM db.employees
    GROUP BY title;
    

4. VIEW

  • 用途:创建虚拟视图,不存储实际数据。

  • 特点:每次引用时都会重新计算,适合轻量级查询。

  • 示例

    sql复制

    MODEL (
      name db.highest_salary,
      kind VIEW
    );
    SELECT
      MAX(salary)
    FROM db.employees;
    

5. EMBEDDED

  • 用途:共享公共逻辑,不创建实际的数据资产。

  • 特点:作为子查询注入到下游模型中。

  • 示例

    sql复制

    MODEL (
      name db.unique_employees,
      kind EMBEDDED
    );
    SELECT DISTINCT
      name
    FROM db.employees;
    

6. SEED

  • 用途:用于静态 CSV 数据集,作为种子数据加载到项目中。
  • 特点:适合初始化数据或静态数据。
  • 示例:无具体 SQL 示例,但可以通过配置文件指定 CSV 文件路径。

7. SCD_TYPE_2_BY_TIME

  • 用途:支持基于时间戳的慢变维度(SCD Type 2),用于跟踪记录的历史变更。

  • 特点:通过 valid_fromvalid_to 列记录历史版本。

  • 示例

    sql复制

    MODEL (
      name db.menu_items,
      kind SCD_TYPE_2_BY_TIME (
        unique_key id
      )
    );
    SELECT
      id::INT,
      name::STRING,
      price::DOUBLE,
      updated_at::TIMESTAMP
    FROM stg.current_menu_items;
    

8. SCD_TYPE_2_BY_COLUMN

  • 用途:支持基于列值变更的慢变维度(SCD Type 2),适用于没有时间戳的表。

  • 特点:通过指定列的值变化来检测记录的变更。

  • 示例

    sql复制

    MODEL (
      name db.menu_items,
      kind SCD_TYPE_2_BY_COLUMN (
        unique_key id,
        columns [name, price]
      )
    );
    SELECT
      id::INT,
      name::STRING,
      price::DOUBLE
    FROM stg.current_menu_items;
    

9. INCREMENTAL_BY_PARTITION

  • 用途:基于分区键增量加载数据,适用于需要按分区键批量更新数据的场景。

  • 特点:新数据会根据分区键插入或替换现有分区数据。

  • 示例

    sql复制

    MODEL (
      name db.events,
      kind INCREMENTAL_BY_PARTITION,
      partitioned_by region
    );
    SELECT
      event_date::TEXT as event_date,
      event_payload::TEXT as payload
    FROM raw_events
    WHERE
      region = @region;
    

10. EXTERNAL

  • 用途:用于指定外部表的元数据,不直接存储数据。
  • 特点:适合引用外部数据源。
  • 示例:无具体 SQL 示例,但可以通过配置文件定义外部表。

11. MANAGED

  • 用途:由底层数据库引擎管理数据生命周期。
  • 特点:适合需要底层引擎优化的场景。
  • 示例:无具体 SQL 示例,但可以通过配置文件定义。

这些模型类型提供了丰富的选择,可以根据具体的数据处理需求选择合适的模型种类。

SQLMesh模型加载数据示例

使用 SQLMesh 进行数据加载涉及以下几个关键步骤:定义模型(Models)配置数据加载逻辑执行计划(Plan)**和**应用到目标数据库(Apply)。以下是详细的步骤说明和示例,帮助你快速上手 SQLMesh 的数据加载流程。

1. 安装 SQLMesh

在开始之前,确保你已经安装了 SQLMesh。可以通过以下命令安装:

bash复制

pip install sqlmesh

2. 定义模型(Models)

SQLMesh 使用 SQL 文件来定义模型,每个模型文件对应一个数据表或视图。模型文件中包含模型的元数据(如模型类型、分区键等)和 SQL 查询。

示例:定义一个增量模型

假设我们有一个日志数据表 raw_events,我们希望按时间范围增量加载数据到 db.events 表中。

  1. 创建模型文件:在项目目录下创建一个 .sql 文件,例如 models/events.sql

  2. 定义模型

    sql复制

    MODEL (
        name db.events,
        kind INCREMENTAL_BY_TIME_RANGE (
            time_column event_date
        )
    );
    
    SELECT
        event_date::TEXT AS event_date,
        event_payload::TEXT AS payload
    FROM raw_events
    WHERE event_date BETWEEN @start_ds AND @end_ds;
    
    • MODEL 块定义了模型的元数据,包括模型名称和类型。
    • INCREMENTAL_BY_TIME_RANGE 表示这是一个基于时间范围的增量模型。
    • @start_ds@end_ds 是 SQLMesh 提供的宏变量,用于动态过滤时间范围内的数据。

3. 配置 SQLMesh 项目

SQLMesh 使用 sqlmesh.yaml 文件来配置项目的基本信息,例如数据库连接、环境设置等。

示例:sqlmesh.yaml 配置文件

yaml复制

default_environment: dev
environments:
  dev:
    dialect: postgres
    connection: postgresql://username:password@localhost:5432/dev_db
  • default_environment 指定了默认环境。
  • environments 定义了不同环境的数据库连接信息。

4. 执行计划(Plan)

在定义好模型和配置文件后,需要生成一个执行计划。计划会根据模型定义和目标数据库的状态,生成需要执行的 SQL 语句。

示例:生成计划

在项目根目录下运行以下命令:

bash复制

sqlmesh plan
  • SQLMesh 会根据模型定义和目标数据库的状态,生成一个执行计划。
  • 你可以通过 --start--end 参数指定计划的时间范围。

5. 应用计划到目标数据库(Apply)

生成计划后,需要将计划应用到目标数据库中,以实际执行数据加载。

示例:应用计划

bash复制

sqlmesh apply
  • 这个命令会将计划中的 SQL 语句应用到目标数据库中。
  • 数据将根据模型定义的逻辑(如增量加载)被加载到目标表中。

6. 其他常用操作

数据重述(Restate)

如果需要重新加载某个模型的数据(例如修复数据问题),可以使用 restatement 命令:

bash复制

sqlmesh plan --restate-model db.events
sqlmesh apply
回填数据(Backfill)

如果需要补全历史数据,可以指定时间范围:

bash复制

sqlmesh plan --start 2024-01-01 --end 2024-01-31
sqlmesh apply

7. 监控和维护

SQLMesh 提供了日志和监控功能,帮助你跟踪数据加载的进度和状态。你可以通过 SQLMesh 的日志文件或集成的监控工具(如 Prometheus)来监控数据加载过程。

示例总结

  1. 定义模型:在 .sql 文件中定义模型的元数据和 SQL 查询。
  2. 配置项目:通过 sqlmesh.yaml 文件配置数据库连接和环境。
  3. 生成计划:运行 sqlmesh plan 生成执行计划。
  4. 应用计划:运行 sqlmesh apply 将计划应用到目标数据库。
  5. 其他操作:根据需要进行数据重述或回填。

通过以上步骤,你可以使用 SQLMesh 高效地进行数据加载和管理。

最后总结

本文深入介绍了 SQLMesh 模型的特点和类型,并通过实际示例展示了如何利用这些模型高效加载数据。SQLMesh 提供的多种模型类型(如 INCREMENTAL_BY_TIME_RANGEINCREMENTAL_BY_UNIQUE_KEYSCD_TYPE_2 等)不仅满足了不同数据处理场景的需求,还通过增量处理和自动优化显著提升了数据加载的效率。希望本文的介绍和示例能帮助你更好地理解和使用 SQLMesh,从而在数据工程实践中实现更高效、更灵活的数据管理和加载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

渗透利器:YAKIT 工具-基础实战教程.

YAKIT 工具-基础实战教程. YAKIT(Yak Integrated Toolkit)是一款基于Yak语言开发的集成化网络安全单兵工具,旨在覆盖渗透测试全流程,提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…

jenkins 配置ssh拉取gitlab

一、生成key ssh-keygen -t rsa -b 4096 -C "root" 二、将id_rsa内容拷贝到jenkins 公钥id_rsa.pub拷贝到gitlab

基于css实现正六边形的三种方案

方案一:通过旋转三个长方形生成正六边形 分析: 如下图所示,我们可以通过旋转三个长方形来得到一个正六边形。疑问: 1. 长方形的宽高分别是多少? 设正六边形的边长是100,基于一些数学常识,可以…

18.Python实战:实现年会抽奖系统

目录结构 python/ ├── sql/ │ └── table.sql # 创建数据库及数据表 ├── config/ │ └── __init__.py # 数据库和Flask配置 ├── static/ │ ├── style.css # 样式文件 │ └── script.js # JavaScript脚本…

145,【5】 buuctf web [GWCTF 2019]mypassword

进入靶场 修改了url后才到了注册页面 注测后再登录 查看源码 都点进去看看 有个反馈页面 再查看源码 又有收获 // 检查$feedback是否为数组 if (is_array($feedback)) {// 如果是数组&#xff0c;弹出提示框提示反馈不合法echo "<script>alert(反馈不合法);<…

19.4.9 数据库方式操作Excel

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本节所说的操作Excel操作是讲如何把Excel作为数据库来操作。 通过COM来操作Excel操作&#xff0c;请参看第21.2节 在第19.3.4节【…

CAS单点登录(第7版)7.授权

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 授权 概述 授权和访问管理 可以使用以下策略实施授权策略以保护 CAS 中的应用程序和依赖方。 服务访问策略 服务访问策略允许您定义授权和访问策略&#xff0c;以控制对向 CAS 注册的…

java集合框架之Map系列

前言 首先从最常用的HashMap开始。HashMap是基于哈希表实现的&#xff0c;使用数组和链表&#xff08;或红黑树&#xff09;的结构。在Java 8之后&#xff0c;当链表长度超过阈值时会转换为红黑树&#xff0c;以提高查询效率。哈希冲突通过链地址法解决。需要明确的是&#xff…

C#windows窗体人脸识别

一、创建一个数据库&#xff0c;名为TestFaceDB 里面有一张表就OK了&#xff0c;表名Users,表里面有几个字段我说明一下&#xff1a; id--------------------bigint----------------------编号 name--------------varchar(50)-----------------用户名 phone--------------v…

53倍性能提升!TiDB 全局索引如何优化分区表查询?

作者&#xff1a; Defined2014 原文来源&#xff1a; https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中&#xff0c;全局索引是一种定义在分区表上的索引类型&#xff0c;它允许索引分区与表分区之间建立一对多的映射关系&#xff0c;即一个索引分区可以对…

Neo4j集群学习

文章目录 官方指导文档Neo4j因果集群核心服务器只读副本因果一致性 Neo4j集群搭建Neo4j企业版下载集群简介虚拟机准备jdk安装实施搭建访问neo4j Web服务 集群添加Core节点 官方指导文档 Neo4j 5 ClusterNeo4j 5 Basic Cluster Neo4j因果集群 集群是Neo4企业版中所提供的功能…

try learning-git-branching

文章目录 mergerebase分离 HEAD相对引用利用父节点branch -f 撤销变更cherry-pick交互式 rebase只取一个提交记录提交的技巧rebase 在上一次提交上amendcherry-pick 在上一次提交上 amend tag多分支 rebase两个parent节点纠缠不清的分支偏离的提交历史锁定的Main learning git …

代码随想录算法【Day46】

Day46 647. 回文子串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1; i > 0; i--) { // 注意遍历顺序for (int j i; j < s…

flutter本地推送 flutter_local_notifications的使用记录

flutter_local_notifications 效果 安卓配置(AndroidManifest.xml) <uses-permission android:name"com.android.alarm.permission.SET_ALARM"/> <uses-permission android:name"android.permission.SCHEDULE_EXACT_ALARM" /> <us…

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …

一个让Stable Diffusion更稳定、更易用的Github开源项目

2023除了ChatGPT大火&#xff0c;Stable Diffusion同样也是非常火热&#xff0c;Stable Diffusion是一个Github开源项目&#xff0c;很多爱好者都会本地安装&#xff0c;但面对一些初学者来说&#xff0c;在安装、配置和使用过程中还是会经常出现很多问题&#xff0c;特别不了解…

Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】

文章目录 DockerJenkins部署SpringBoot项目一.准备工作1.1安装jdk111.2安装Maven 二.Docker安装Jenkins2.1安装Docker2.2 安装Jenkins2.3进入jenkins 三.Jenkins设置3.1安装jenkins插件3.2全局工具配置全局配置jdk全局配置maven全局配置git 3.3 系统配置安装 Publish Over SSH …

.NET SixLabors.ImageSharp v1.0 图像实用程序控制台示例

使用 C# 控制台应用程序示例在 Windows、Linux 和 MacOS 机器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.NET Core 3.1/ …

soular基础教程-使用指南

soular是TikLab DevOps工具链的统一帐号中心&#xff0c;今天来介绍如何使用 soular 配置你的组织、工作台&#xff0c;快速入门上手。 &#xfeff; 1. 账号管理 可以对账号信息进行多方面管理&#xff0c;包括分配不同的部门、用户组等&#xff0c;从而确保账号权限和职责…

《Spring实战》(第6版)第1章 Spring起步

第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean)&#xff0c;与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…