SQLMesh系列教程-3:SQLMesh模型属性详解
SQLMesh 的
MODEL提供了丰富的属性,用于定义模型的行为、存储、调度、依赖关系等。通过合理配置这些属性,可以构建高效、可维护的数据管道。在 SQLMesh 中,MODEL是定义数据模型的核心结构,初学SQLMesh,定义模型看到属性会很迷惑,本文主要解释sqlmesh的模型属性,为后续继续学习打基础。

模型属性
在 SQLMesh 中,MODEL 是定义数据模型的核心结构,除了 kind 属性外,还有许多其他属性可以配置。MODEL DDL语句具有各种属性,这些属性用于元数据和控制行为。在模型配置参考中了解有关这些属性及其默认值的更多信息。以下是 MODEL 的常见属性及其说明,以及一个完整示例。
- name
Name指定模型的名称。该名称表示模型输出的产品视图名称,因此它通常采用“schema”.“view_name”的形式。在SQLMesh项目中,模型的名称必须是唯一的。
当模型在非生产环境中使用时,SQLMesh会自动为模型名称添加前缀。例如,考虑一个名为“sushi”、“customers”的模型。在dev中,它的视图命名为“sushi__dev”.“customers”。
name属性是必需的,并且必须是唯一的,除非启用了名称自动推断。

- project
Project指定模型所属的项目的名称。用于多仓库SQLMesh部署。
- Kind
Kind指定模型的类型。模型的类型决定了如何计算和存储模型。SQL模型的默认类型是VIEW,这意味着创建一个视图,并且每次访问该视图时都要运行查询。另一方面,Python模型的默认类型是FULL,这意味着每次计算模型时都会创建一个表并执行Python代码。每个类型未来我们会分别详细说明,你也可以参考官网文档。
- audits(审计)
审计指定在评估模型后应该运行哪些审计。
Dialect定义模型的SQL方言。默认情况下,它使用配置文件model_defaults方言键中的方言。SQLGlot库支持的所有SQL方言都是允许的。
Owner指定模型的主要联系人是谁。对于拥有许多数据合作者的组织来说,这是一个重要的领域。
一个可选的任意字符串序列,用于在不更改定义的功能组件的情况下创建新的模型版本。
标签是用于组织模型的一个或多个标签。
- cron
Cron用于调度模型处理或刷新数据的时间。它接受一个cron表达式或@hour、@daily、@weekly或@monthly中的任意一个。所有时间都假定为UTC时区-不可能在不同的时区中指定它们。
- interval_unit
间隔单元确定用于计算模型的时间间隔的时间粒度。缺省情况下,间隔单位是自动从cron表达式派生出来的,不需要指定。
支持的取值为:year, month, day, hour, half_hour, quarter_hour, five_minute.
与cron的关系
SQLMesh调度器需要来自模型的两个时间信息片段:模型应该运行的特定时间,以及处理或存储数据的最佳时间粒度。interval_unit指定了粒度。
如果模型的cron参数是一个频率,比如@daily,那么运行时间和interval_unit就很容易确定:模型准备在一天开始时运行,它的interval_unit是day。类似地,@hour的cron准备在每个小时开始时运行,其interval_unit为hour。
但是,如果用cron表达式指定cron, SQLMesh将使用更复杂的方法派生interval_unit。
cron表达式可以生成复杂的时间间隔,因此SQLMesh不会直接解析它。相反, 处理过程如下:
-
从cron表达式生成接下来的五个运行时(相对于计算时间)
-
计算这五个值之间的间隔的持续时间
-
确定模型的interval_unit为小于或等于的最大间隔单位值
例如,考虑一个对应于“每43分钟运行一次”的cron表达式。它的interval_unit是half_hour,因为这是小于43分钟的最大interval_unit值。如果cron表达式是“每67分钟运行一次”,那么在相同的逻辑下,它的interval_unit是小时。
然而,interval_unit不需要从cron中推断出来——您可以显式地指定它来定制回填的方式。
指定interval_unit
模型通常以有规律的节奏运行,每次运行之间经过的时间相同,每次运行中处理数据的时间长度相同。
例如,一个模型可能每天在午夜运行(每天运行1次),以处理前一天的数据(每次运行1天的数据)。两次运行之间的时间长度和每次运行中处理的数据的时间长度都是1天(如果您错过了一次运行,则都是2天)。
但是,运行节奏长度和处理过的数据长度不必相同。
考虑一个每天早上7:30运行并处理数据直到今天早上7点的模型。模型的cron是表示“每天早上7:30运行”的cron表达式,SQLMesh从中推断出每天的interval_unit。
当这个模型运行时会发生什么?首先,SQLMesh将识别最近完成的时间间隔。interval_unit被推断为day,所以最后一个完整的间隔是昨天。在运行中,SQLMesh将不包含今天上午12:00到7:00之间的任何数据。
要包含今天的数据,请手动指定一个以小时为单位的间隔。当模型在7:30am运行时,SQLMesh将把最近完成的小时间隔标识为6:00-7:00am,并在回填中包含该间隔内的数据。
MODEL (name sqlmesh_example.up_until_7,kind INCREMENTAL_BY_TIME_RANGE (time_column date_column,),start '2024-11-01',cron '30 7 * * *', -- cron expression for "every day at 7:30am"interval_unit 'hour', -- backfill up until the most recently completed hour (rather than day));
下面我们再配置一个模型:
- 每小时运行一次
- 每次运行时处理最近两天的数据
- 处理迄今为止在每次运行中积累的数据
配置此模型需要通过设置模型配置allow_partials True让SQLMesh处理部分完成的间隔。部分间隔的数据只是临时的——SQLMesh将在整个间隔完成后重新处理它。
MODEL (name sqlmesh_example.demo,kind INCREMENTAL_BY_TIME_RANGE (time_column date_column,lookback 2, -- 2 days of late-arriving data to backfill),start '2024-11-01',cron '@hourly', -- run model hourly, not tied to the interval_unitallow_partials true, -- allow partial intervals so today's data is processed in each runinterval_unit 'day', -- finest granularity of data to be time bucketed
);
lookback 以天为单位计算,因为模型的interval_unit指定为天。
Start用于确定处理模型所需的最早时间。它可以是绝对日期/时间(2022-01-01),也可以是相对日期/时间(1年前)。
End用于确定处理模型所需的最晚时间。它可以是绝对日期/时间(2022-01-01),也可以是相对日期/时间(1年前)。
描述属性是可选的。自动注册为底层SQL引擎的表描述/注释(如果引擎支持)。
- column_descriptions
可选的键/值对字典。自动注册为底层SQL引擎的列描述/注释(如果引擎支持)。如果不存在,内联注释将自动注册。示例如下:
column_descriptions (id = 'primary key',letter = 'alphabet letter',value = 'random value',updated_date = 'updated date',new_col = 'a new column')
模型的粒度是在模型查询返回的结果中唯一标识一行的列或列的组合。如果设置了粒度,像table_diff这样的SQLMesh工具会更容易运行,因为它们会自动使用模型粒度来指定参数,否则需要手动指定。
如果一个模型有多个唯一键或键的组合,那么它可以定义多个粒度。
引用是标识到另一个模型的连接关系的非唯一列或列的组合。
例如,一个模型可以定义一个引用account_id,这将表明它现在可以自动连接到任何具有account_id粒度的模型。它不能安全地连接到具有account_id引用的表,因为引用不是唯一的,这样做将构成多对多连接。
有时列的名称不同,在这种情况下,可以将列名称别名设为公共实体名称。例如,guest_id AS account_id将允许列为guest_id的模型连接到粒度为account_id的模型。
- depends_on
Depends显式地指定模型所依赖的模型,以及从模型代码中自动推断出来的模型。
- table_format
对于支持iceberg和hive等表格式的引擎来说,表格式是一个可选属性,其中物理文件格式是可配置的。目的是使用table_format定义表类型,然后使用storage_format定义表内文件的磁盘格式。
请注意,此属性仅适用于允许独立于storage_format配置table_format的引擎。
- storage_format
存储格式是Spark或Hive等支持parquet和orc等存储格式的引擎的属性。请注意,有些引擎不会区分table_format和storage_format,在这种情况下,使用storage_format而忽略table_format。
- partitioned_by
分区起两个作用。对于大多数模型类型,它是支持表分区(如Spark或BigQuery)的引擎的可选属性。
对于INCREMENTAL_BY_PARTITION模型类型,它定义了用于增量加载数据的分区键。
它可以指定多列分区键或修改用于分区的日期列。例如,在BigQuery中,你可以使用partitioned_by TIMESTAMP_TRUNC(event_ts, day)提取时间戳列event_ts的日期组件,从而按天进行分区。
- clustered_by
Clustered by是Bigquery等支持集群的引擎的可选属性。
- columns
默认情况下,SQLMesh从其SQL查询推断模型的列名和类型。通过在模型的columns属性中手动指定所有列名和数据类型来禁用该行为。
**警告:**如果columns属性包含查询未返回的列、省略查询返回的列或指定查询返回的数据类型以外的数据类型,SQLMesh可能会出现意外行为。
例如,下面示例包含columns键的seed模型定义。它指定文件中所有列的数据类型:holiday_name列的数据类型是VARCHAR, holiday_date列的数据类型是DATE。
MODEL (name test_db.national_holidays,kind SEED (path 'national_holidays.csv'),columns (holiday_name VARCHAR,holiday_date DATE)
);
注意:返回dataframe的Python模型需要指定列名和数据类型。
- physical_properties
以前命名为table_properties
physical_properties是应用于物理层中的模型表/视图的任意属性的键值映射。注意分区细节和creatable_type,它覆盖了所创建的模型/视图的类型。在本例中,它创建了一个TRANSIENT TABLE。虽然creatable_type是通用的,但其他属性是特定于适配器的,因此请查看引擎文档。例如:
MODEL (...,physical_properties (partition_expiration_days = 7,require_partition_filter = true,creatable_type = TRANSIENT)
);
- virtual_properties
virtual_properties是应用于虚拟层中的模型视图的任意属性的键值映射。注意分区细节和creatable_type,它覆盖了所创建的模型/视图的类型。在本例中,它创建了一个SECURE VIEW。虽然creatable_type是通用的,但其他属性是特定于适配器的,因此请查看引擎文档。例如:
MODEL (...,virtual_properties (creatable_type = SECURE,labels = [('test-label', 'label-value')])
);
- session_properties
会话属性是应用于引擎会话的特定于目标引擎的任意属性的键值映射。
- allow_partials
指示此模型可以对部分(不完整)数据间隔执行。
默认情况下,每个模型只处理完整的间隔,以防止部分数据引起的常见错误。区间的大小由模型的interval_unit决定。
将allow_partials设置为true将覆盖此行为,这表明模型可能会处理丢失某些数据点的输入数据段。
注意:将此属性设置为true将忽略cron属性。
是否启用模型。默认情况下,此属性为true。将其设置为false将导致SQLMesh在加载项目时忽略此模型。
- physical_version
将此模型的物理表的版本固定到给定的值。
注意:这只能为仅向前的模型设置。
指定要用于执行此模型的网关。如果不指定,则使用默认网关。
- optimize_query
模型的查询是否需要优化。默认情况下,所有SQL模型都是优化的。将其设置为false将导致SQLMesh禁用查询规范化和简化。只有当优化后的查询导致错误(如超出文本限制)时,才应该关闭该功能。
- validate_query
是否在编译时验证模型的查询。默认情况下,该属性为false。将其设置为true会导致SQLMesh引发错误而不是发出警告。这将在SQL语句中显示无效的列,以及包含SELECT *的模型,这些模型不能自动展开以列出所有列。这样可以确保在花费时间和金钱在数据仓库中运行SQL之前在本地验证SQL。
完整示例
以下是一个完整的 SQLMesh 模型定义示例,展示了多个属性的使用:
MODEL (name sales.fact_sales, -- 模型名称kind INCREMENTAL, -- 模型类型为增量模型storage_format 'PARQUET', -- 存储格式为 Parquetpartitioned_by 'order_date', -- 按 order_date 分区clustered_by ['customer_id'], -- 按 customer_id 聚类tags ['sales', 'fact'], -- 添加标签description 'Fact table for sales data', -- 模型描述columns { -- 显式定义列order_id INT,customer_id INT,product_id INT,order_date DATE,quantity INT,amount DECIMAL(10, 2)},dependencies ['raw_sales'], -- 依赖 raw_sales 表unique_key ['order_id'], -- 唯一键为 order_idgrained_by 'order_date', -- 数据粒度为 order_dateallow_incremental TRUE, -- 允许增量运行cron '0 0 * * *', -- 每天凌晨运行owner 'data_team', -- 负责人为 data_teampre { -- 前置钩子DELETE FROM sales.fact_sales WHERE order_date = @execution_date;},post { -- 后置钩子ANALYZE TABLE sales.fact_sales;}
);-- 模型查询逻辑
SELECTorder_id,customer_id,product_id,order_date,quantity,amount
FROMraw_sales
WHEREorder_date > @prev_execution_date; -- 只处理新增数据
总结
SQLMesh 的 MODEL 提供了丰富的属性,用于定义模型的行为、存储、调度、依赖关系等。通过合理配置这些属性,可以构建高效、可维护的数据管道。以上示例展示了如何结合多个属性来定义一个完整的增量模型。
相关文章:
SQLMesh系列教程-3:SQLMesh模型属性详解
SQLMesh 的 MODEL 提供了丰富的属性,用于定义模型的行为、存储、调度、依赖关系等。通过合理配置这些属性,可以构建高效、可维护的数据管道。在 SQLMesh 中,MODEL 是定义数据模型的核心结构,初学SQLMesh,定义模型看到属…...
Java 中的 HashSet 和 HashMap 有什么区别?
一、核心概念与用途 特性HashSetHashMap接口实现实现 Set 接口(存储唯一元素)实现 Map 接口(存储键值对)数据存储存储单个对象(元素唯一)存储键值对(键唯一,值可重复)典…...
Kubernetes-master 组件
以下是Kubernetes Master Machine的组件。 etcd 它存储集群中每个节点可以使用的配置信息。它是一个高可用性键值存储,可以在多个节点之间分布。只有Kubernetes API服务器可以访问它,因为它可能具有一些敏感信息。这是一个分布式键值存储,所…...
【Leetcode 952】按公因数计算最大组件大小
题干 给定一个由不同正整数的组成的非空数组 nums ,考虑下面的图: 有 nums.length 个节点,按从 nums[0] 到 nums[nums.length - 1] 标记;只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时,nums[i] 和 nums[j]之…...
js考核第三题
题三:随机点名 要求: 分为上下两个部分,上方为显示区域,下方为控制区域。显示区域显示五十位群成员的学号和姓名,控制区域由开始和结束两个按钮 组成。点击开始按钮,显示区域里的内容开始滚动,…...
【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】
引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…...
简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标
作为国产数据库的领军选手,金仓数据库(KingbaseES)凭借其成熟的技术架构和广泛的市场覆盖,在国内众多领域中扮演着至关重要的角色。无论是国家电网、金融行业,还是铁路、医疗等关键领域,金仓数据库都以其卓…...
Java和JavaScript当中的json对象和json字符串分别讲解
Java和JavaScript当中的json对象和json字符串分别讲解 一、Java当中的json对象和json字符串 在 Java 中,JSON 对象和 JSON 字符串有不同的表示和操作方式。 1. JSON 对象: 如果你使用的是 org.json 库,创建 JSON 对象的代码如下࿱…...
【第11章:生成式AI与创意应用—11.2 音频与音乐生成的探索与实践】
凌晨三点的录音棚里,制作人小林对着空荡荡的混音台抓狂——广告方临时要求将电子舞曲改编成巴洛克风格,还要保留"赛博朋克"元素。当他在AI音乐平台输入"维瓦尔弟遇见霓虹灯"的瞬间,一段融合羽管键琴与合成器的奇妙旋律喷涌而出,这场人与机器的音乐狂想…...
八、SPI读写XT25数据
8.1 SPI 简介 SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,广泛用于嵌入式系统中连接微控制器与外围设备,如传感器、存储器、显示屏等。 主要特点 1. 全双工通信:支持同时发送…...
Visionpro 齿轮测量
效果展示 一、题目要求 求出最大值,最小值,平均值 二、分析 1.首先要进行模板匹配 2.划清匹配范围 3.匹配小三角的模板匹配 4.卡尺 5.用找圆工具 工具 1.CogPMAlignTool 2.CogCaliperTool 3.CogFindCircleTool 4.CogFixtureTool 三、模板匹…...
Ubuntu20.04部署stable-diffusion-webui环境小记
Ubuntu20.04部署stable-diffusion-webui环境小记 文章目录 前言后视镜视角查看安装文档聊聊我踩的那些坑python3.11的安装执行sudo apt update报错显卡驱动内存优化网络问题无法打开系统设置和网络设置查询GPU使用情况 总结 Stable Diffusion web UI A web interface for Stabl…...
索引以及索引底层数据结构
一、什么是索引? 索引(index)是数据库高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B树),这些数据结构以某种方式指向真在…...
开业盛典活动策划方案拆解
道叔来给大家详细剖析咱们方案库里刚收录的这份《蜀大侠火锅店武侠风开业盛典活动策划方案》了,保证让你看完直呼过瘾,收获满满! 一、主题创意:武侠风,直击人心 首先,咱们得夸一下这活动的主题——“XXX‘…...
API 接口自动化
HTTP协议 - 白月黑羽 HTTP协议简介 如果客户端是浏览器,如何在chrome浏览器中查看 请求和响应的HTTP消息?按f12-》network 清除当前信息 响应的消息体在Response里看 点preview,可以看响应的消息体展开的格式 HTTP请求消息 请求头 reques…...
安全测试|SSRF请求伪造
前言 SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...
ML.NET库学习008:使用ML.NET进行心脏疾病预测模型开发
文章目录 ML.NET库学习008:使用ML.NET进行心脏疾病预测模型开发1. 项目主要目的和原理2. 项目概述实现的主要功能:主要流程步骤:关键技术: 3. 主要功能和步骤数据加载与路径处理模型训练与评估模型保存与加载 4. 代码中的数据结构…...
了解rtc_time64_to_tm()和rtc_tm_to_time64()
rtc_time64_to_tm()和rtc_tm_to_time64()主要用于RTC的驱动程序,在Linux外部RTC驱动中较常见。 打开“drivers/rtc/lib.c” /* * rtc_time64_to_tm - Converts time64_t to rtc_time. * Convert seconds since 01-01-1970 00:00:00 to Gregorian date. */ //将ti…...
verilog程序设计及SystemVerilog验证
1.Verilog测试程序设计基础 1.1Testbench及其结构 在仿真的时候Testbench用来产生测试激励给待验证设计( Design Under Verification, DUV),或者称为待测设计(Design UnderTest, DUT) 。 测试程序的一般结构: Testbench是一个测试平台,信号…...
智能编程助手功能革新与价值重塑之:GitHub Copilot
引言: GitHub Copilot 的最新更新为开发者带来了显著变化,其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令,并具备多级任务推理能力,这使得开发者在开发复杂功能时,可大幅减少…...
物联网行业通识:从入门到深度解析
物联网行业通识:从入门到深度解析 (图1:物联网生态示意图) 一、引言:万物互联时代的到来 根据IDC最新预测,到2025年全球物联网设备连接数将突破410亿,市场规模达1.1万亿美元。物联网ÿ…...
ABP - 事件总线之分布式事件总线
ABP - 事件总线之分布式事件总线 1. 分布式事件总线的集成1.2 基于 RabbitMQ 的分布式事件总线 2. 分布式事件总线的使用2.1 发布2.2 订阅2.3 事务和异常处理 3. 自己扩展的分布式事件总线实现 事件总线可以实现代码逻辑的解耦,使代码模块之间功能职责更清晰。而分布…...
【硬件设计细节】缓冲驱动器使用注意事项
一、缓冲驱动器核心功能与选型原则 信号增强与隔离 驱动能力匹配:根据负载电流需求选择缓冲器,例如CMOS缓冲器驱动能力通常为4-8mA,需搭配大电流负载时选用图腾柱输出或专用驱动芯片(如TI的SN74LVC系列)。电压域转换&…...
驱动开发系列38 - Linux Graphics 3D 绘制流程(一)- 创建画布
一:概述 当应用程序创建 OpenGL 上下文时,它通常需要申请帧缓冲(Framebuffer,即画布)。在 X11 体系下,应用程序不会直接向内核的 DRM 模块请求创建帧缓冲,而是通过 X 服务器进行申请。 虽然从技术上讲,应用程序可以直接使用 DRM 接口创建帧缓冲对象(BO),但为了将其与…...
再谈SpringCloud Gateway源码
再谈SpringCloud Gateway源码 一、整体请求流程二、前置对象准备1、实例化HandlerMapping2、实例化Route3、实例化WebHandler 三、实践业务扩展点1、定义扩展Route对象2、Filter能做什么3、定义扩展Filter对象4、定义父类Filter简化请求参数处理 前言: 之前有阅读过…...
把 CSV 文件摄入到 Elasticsearch 中 - CSVES
在我们之前的很多文章里,我有讲到这个话题。在今天的文章中,我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…...
3.【线性代数】——矩阵乘法和逆矩阵
三 矩阵乘法和逆矩阵 1. 矩阵乘法1.1 常规方法1.2 列向量组合1.3 行向量组合1.4 单行和单列的乘积和1.5 块乘法 2. 逆矩阵2.1 逆矩阵的定义2.2 奇异矩阵2.3 Gauss-Jordan 求逆矩阵2.3.1 求逆矩阵 ⟺ \Longleftrightarrow ⟺解方程组2.3.2 Gauss-Jordan求逆矩阵 1. 矩阵乘法 1.…...
SpringCloud面试题----如何对 Spring Cloud 微服务进行性能优化
架构层面 合理划分微服务 单一职责原则:确保每个微服务只负责单一的业务功能,这样可以降低服务的复杂度,提高可维护性和可扩展性。例如,将用户认证、订单管理、商品管理等不同功能拆分成独立的微服务。避免服务间过度耦合:减少微服务之间的依赖关系,避免因为某个服务的变…...
使用llama.cpp在gpu和cpu上运行deepseek-r1 7b的性能对比
使用deepseek-r1 7b模型的q5km量化版本进行测试, gpu上的token解码速度是cpu的近8倍. 测试环境: ubuntu22.04 x86llama.cpp cpu intel 10750h 4.41 tokens / s model size params backend threads test t/s qwen2 7B Q5_K - Medium 5.07 GiB 7.62 B CPU 6 pp512 …...
BMS项目-面试及答疑整理
1. SOC计算用的什么原理实现的? bms目前计算SOC使用的安时积分+开路电压首先得对电池有一个抽象得概念,把电池比作游泳池,电量比作游泳池里面的水,电流比作流入和流出得水流,那么充电也就是往游泳池里面灌入水流安时积分:对水流进行一个实时监测,比如1S一次监测,那么每…...
