Dbt增量策略模型实践指南

参考:dbt Incremental Strategies | Indicium Engineering (medium.com)

本文讨论dbt的增量策略,介绍工作原理、以及各自优缺点。下篇讲解如何在模型中实现增量策略。

使用增量模型可以仅仅处理最近的数据,减少数据处理成本和时间。当然首先要明确我们真的需要使用增量策略吗?增量物化选项是dbt中高级强大的特性,并不需要每个模型都需要使用。使用增量物化模型需要增加一些配置以及一堆jinja条件代码。

增量策略场景

前面我们提及无需在每个模型中使用策略策略。很多场景中完全刷新策略(full refresh)可能更好,本节简要讨论这个议题。在DW中,通常模型缺省采用完全刷新策略。如果没有定义增量物化选项,则每次运行会重建表。首先会删除目标表,然后用整个源表中已转换数据创建并填充新的目标表。

你可能觉得这不是最优的转换过程,因为需要花大量时间和处理能力创建整个表,但它也有其优势之处。

首先,完全刷新策略在复杂性和处理成本/时间之间存在明显的权衡。它复杂度低,无需担心更合增量规则和配置,且能确保目标表可以接收到所有已转换数据,当然也需要花更多时间和资源重建整个表。如果表数据量不是很大,假设少于100万或更少,转换性能不是问题,也不用担心成本和时间,则坚持采用完全刷新策略没有问题。

回到低复杂性及生产率角度来看,使用完全刷新策略可以更快地把目标表提供给最终用户,从而尽快产生价值。这样最终用户可以自由地验证转换并给出反馈,要求更改或优化。

除此之外,在生产环境中有转换后的表可以让分析工程师更精确地了解数据情况,如:数据更新的方式和频率,以及每次运行中处理的数据量。这些都是模型优化步骤中需要考虑的重要问题。在优化步骤中,评估策略以减少转换的成本、处理量或处理时间。这可以通过多种方式实现,例如删除不生成值的列或更改模型物化方式等。下面总结下完全刷新策略的关键点:

分类内容
优势实现简单、更快产生价值、保证所有数据插入至目标表,不考虑数据库更新规则
劣势处理成本高、处理时间多
场景不担心成本和时间时(表数据量小、或转换规则简单),静态数据多于动态数据,历史数据更新频繁

如果你需要降低成本或加快转换速度,或者待处理表经常接收新数据,并且你对dbt比较熟悉,则应该尝试增量模型。

增量模型

增量物化选项目标是为减少处理时间与成本,仅转换并插入最近新增的数据。为了让Dbt知道那些是最新的数据,表中应该有以下类型的列:date, datetime, timestamp, 或 int64。增量模型使用源表中列和目标表过滤那些数据需要增量转换、插入、更新或删除。

特别需要说明的是,增量策略不会捕获对旧记录所做的修改。因此,一个好的做法是定期以完全刷新模式运行表以更新历史数据。

如果满足以下三个条件,模型表将以增量方式运行:

(1) 目标表已经存在于数据库中;

(2) dbt不是以完全刷新模式运行(没有使用——full-refresh 选项);

(3) 运行模型配置了materialized=‘incremental’

dbt提供了四种类型增量策略:

  • append
  • merge
  • delete+insert
  • insert_overwrite

策略的可用性取决于你配置的数据库适配器。dbt官方文档列出了常见适配器及其策略支持列表。

data platform adapterappendmergedelete+insertinsert_overwrite
dbt-postgres
dbt-redshift
dbt-bigquery
dbt-spark
dbt-databricks
dbt-snowflake
dbt-trino
dbt-fabric

dbt-postgres支持下面几种物理策略:

  • append (缺省没有定义unique_key)
  • merge
  • delete+insert (缺省当定义了unique_key)

追加策略(Append)

追加策略非常简单,它只获取选中的记录并将它们插入目标表中。它不能更新或删除记录,只能插入。只有当重复记录对你来说不是问题时,您才能使用此策略。Append不担心重复,它不会检查记录是否已经存在于目标表中,它只会插入新增的记录,不考虑是否重复。

分类内容
优势简单直接;无需扫描目标表、处理成本低;处理时间少;
劣势不更新、删除记录,仅仅插入;存在重复记录;
场景当你只是想插入新增记录,重复记录都不是问题;

合并策略(Merge)

合并策略解决重复记录问题,如果你指定唯一键(支撑组合列)能处理重复键问题。如果基于唯一键检查,目标记录已经存在目标表中,合并策略将更新记录,所以不会有重复记录。如果目标记录不存在则直接插入记录。

为了检查两个表的唯一键,合并策略需要扫描整个目标表,同时查询源表的部分记录。执行全表扫描会有较大的性能成本。如果合并策略不指定唯一键,则变成追加操作。

为了提升合并策略的性能,减少性能成本,目标表可以设置索引,避免执行目报表全表扫描。

分类内容
优势避免重复 、百万级以下数据量运行良好
劣势处理成本高,需要全表扫描(可以使用聚集索引提升性能)
场景表数据量相对小,避免重复记录,希望实现增量,且重复记录需要更新

删除插入

删除插入策略与合并策略类似,但采用插入新记录代替更新记录。首先删除已经存在的记录、然后插入新记录和已存在的记录;因为删除目标表中已经存在的记录,所以也不存在重复记录。

删除插入策略同样也需要全表扫描目标表进行比较唯一键,然后删除已经存在的记录并插入增量记录。采用删除而不是更新,这通常和目标数据支持的存储引擎相关,尤其是基于分区表的情况,采用直接删除分区效率更好。

插入覆盖

最后要介绍的是插入覆盖策略。主要解决全表扫描问题,该方案需要与分区一同工作。

分区表把表按照一定规则分成多个段。插入覆盖支持的分区类型包括:date, datetime, timestamp, int64,粒度可以为hour, day, month 或 year。如果按照int64类型分区需要指定范围,基于对应列值形成分区,所有分区中的记录采用基于相同的粒度值。

插入覆盖策略删除从目标表中删除已选择的分区,然后插入新增已转换的数据分区。因为采用分区表,避免了全表扫描。这是与合并策略的差异,极大地减少了处理数据的数量。

除了使用分区,过程与删除插入策略非常类似,但删除插入策略使用两个独立语句,删除和插入语句。插入覆盖使用合并语句。另外,插入覆盖策略复杂度高,如果分区字段配置不当会造成数据重复。

分类内容
优势低处理成本、低处理时间
劣势高度复杂、配置不当可能造成数据重复
场景数据量非常大,性能和处理数据已经造成问题

总结

现在你应该对何时使用增量和何时不使用增量有了更清晰的概念。此外,你知道每种策略是如何工作的,并且知道何时使用何种策略。在下一篇文章中,我将展示如何在实践中实现增量策略。期待您的真诚反馈,更多内容请阅读数据分析工程专栏。

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

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

相关文章

Solon 3.0 引入 SqlUtils :数据库操作的反朴归真

Solon 3.0 版本发布后,带了一个新的特性 —— SqlUtils。这一全新的数据库操作框架给开发者提供了更加透明、灵活的数据库交互方式,可显著提升了代码的透明度和维护性。本文将浅入探讨 SqlUtils 的引入背景、使用方法以及它对市场和开发者群体的潜在影响…

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix; 2. pytorch 与 pytorch geometric 各…

自动化的抖音

文件命名 main.js var uiModule require("ui_module.js"); if (!auto.service) {toast("请开启无障碍服务");auto.waitFor();} var isRunning true; var swipeCount 0; var targetSwipeCount random(1, 10); var window uiModule.createUI(); uiMo…

ComfyUI | 5分钟部署最新Flux大模型

Midjourney 和 Stable Diffusion 都是目前流行的 AI 图像生成工具,它们能够根据文本描述生成高质量的图像。都是基于深度学习技术的文本到图像生成模型,但它们各自基于不同的大模型。 但最近推出了一款比前两者更强大,生成图像更加逼真&…

windows端口被占用但是查不到进程的问题排查

在开发环境上经常遇到端口被占用,但是 netstat -ano|findstr 3306 查不到进程号,没法强杀解决。 这种情况,很有可能端口被排除了,可用命令: netsh interface ipv4 show excludedportrange protocoltcp 可以看到mysql的…

前端面试题(十四)

76. 前端性能优化 前端性能优化有哪些常见方法? 减少 HTTP 请求: 合并 CSS、JavaScript 和图片文件。使用雪碧图 (Sprite) 减少图片请求数。 资源压缩和合并: 压缩 JavaScript 和 CSS 文件,减少文件体积。使用工具如 UglifyJS、…

一、制作UI自适应

当前分辨率 更改分辨率 一、原因 一款游戏的UI,可能会根据玩家的分辨率和屏幕尺寸,产生不同的变化 例如:某一个Image位移到了摄像机外面 因此需要通过锚点和屏幕自适应来制作完美的效果 二、解决方法 1、锚点 作用是:根据当…

Unity3D相关知识点总结

Unity3D使用的是笛卡尔三维坐标系,并且是以左手坐标系进行展示的。 1.全局坐标系(global) 全局坐标系描述的是游戏对象在整个世界(场景)中的相对于坐标原点(0,0,0)的位置…

前端接收到的日期格式为 2021-12-07T16:44:53.298+00:00 怎么办?

在写项目的时候,给前端发送了一个 Date 类型的数据,发现格式不对: 可以通过在application 配置文件中进行如下配置: spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8 前端在获取就发现格式正确

嵌入式硬件设计:从原理到实践

嵌入式硬件设计:从原理到实践 嵌入式硬件设计在物联网、智能设备、工业自动化等领域中扮演着至关重要的角色。随着技术的发展,越来越多的设备依赖于嵌入式系统进行实时控制与数据处理。本文将详细介绍嵌入式硬件设计的各个方面,从设计原理到…

Study-Oracle-11-ORALCE19C-ADG集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、ORACLE--ADG VS ORACLE--DG的区别 1、DG是Oracle数据库的一种灾难恢复和数据保护解决方案,它通过在主数据库和一个或多个备用数据库之间实时复制数据,提供了数据的冗余备份和故障切换功能。…

实现一个时钟

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter>//画家类 #include<QTime>//时间类 #include<QTimer>//定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget …

项目管理——Gantt图与Pert图

目录 前言相关知识点相关题目 前言 本文是在关于软考中软件设计师中的项目管理中的知识点&#xff0c;关于Gantt图与Pert图 相关知识点 甘特&#xff08;Gantt&#xff09;图 优点 可以清晰的描述每个任务从何时开始的&#xff0c;到何时结束&#xff0c;任务的进程情况以及…

互联网协议(IP)中最常用的端口

80 端口和 443 端口是互联网协议&#xff08;IP&#xff09;中最常用的两个端口&#xff0c;分别用于 HTTP 和 HTTPS 通信。以下是它们的作用、区别以及相关背景信息&#xff1a; 80 端口和 443 端口的作用 80 端口&#xff1a; 用于 HTTP&#xff08;HyperText Transfer Prot…

C++和OpenGL实现3D游戏编程【连载14】——VBO、VAO和EBO应用

&#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 我们从一开始学OpenGL到现在&#xff0c;OpenGL的图形绘图必须在glBegin()和glEnd()函数之间完成&#xff0c;在此基础之上&#xff0c;才能进行后续操作功能。但是我们今天要讨论一下OpenGL图形绘制的模式&a…

SSM(5)(动态sql <if>、<where>、返回主键值)

返回主键值&#xff1a; 方法一&#xff1a; useGeneratedKeys 为ture 声明 返回主键 keyProperty 表示要返回的值 封装到对象的属性中 但是这一种方法不支持Orcal数据库。 <insert id"save2" parameterType"com.findyou.entity.User" useGenerated…

C++面试速通宝典——23

420. 一个类有一个int和一个char有多大&#xff1f; 假设不考虑虚函数或虚继承&#xff0c;该类的大小通常由以下情况确定&#xff1a; int类型通常占用4个字节char类型占用1个字节 由于内存对齐&#xff0c;编译器可能在int和char之间或者char后面添加填充字节&#xff0c;…

error C2081: “FILE_INFO_BY_HANDLE_CLASS”: 形参表中的名 称非法

这破玩意好像是windows sdk的问题, 更新一下版本好像就可以解决. 本质是少了 #define WDK_NTDDI_VERSION NTDDI_WIN10_NI 可以在本地的config.h 或者其他文件先替它定义一下. -------------------------------------------- 如果sdk版本没问题,应该在…

使用IMX6UL定时器EPTI实现延时

上一节&#xff0c;我们讲解了如何使用Imx6uL上面的定时器EPTI&#xff0c;这一节我们将使用EPTI进行实战&#xff0c;也就是使用定时器的效果来使用延时 在之前的实验中我们都使用到了按键&#xff0c;用到按键就要处理因为机械结构带来的按键抖动问题&#xff0c;也就是按键消…

01 为什么要学习数据结构与算法

为什么要学习数据结构与算法 一、问题提出 ​ 最早计算机的设计初衷主要用于军事上枪炮的弹道计算和火力表的测试&#xff0c;后来更多的用于科学计算&#xff0c;即数值类的计算&#xff0c;而现在&#xff0c;计算机深入到日常生活的各个方面&#xff0c;其计算的数据早已从…