深入理解 dbt 增量模型
想要实现数据增量写入数据库,可以选择 dbt 增量模型。通过 dbt 增量模型,我们只用专注于写日增 SQL,不用去关注于如何安全的实现增量写入。
dbt 增量模型解决了什么问题
- 原子性写入:任何情况下,增量写入只有一个程序在写入。
假设增量程序已经上线,线上增量程序在执行的同时,开发也在本地执行增量程序。俩分程序同时执行,难以保证线上数据的正确性。
如何使用 dbt 增量写入
{{config(
materialized='incremental',
unique_key=['unique_key', 'time_column'],
incremental_strategy='merge'
)}}
select *
from table
where time_column >= date_add('day', -1, current_timestamp)
dbt 执行增量写入流程
- delete + insert
- drop if exists tmp_table
- create tmp_table as ( incremental sql )
- delete from table where file in ( select file in tmp_table ) and file2 in ....
- insert into table select * from tmp_table
- merge
- drop if exists tmp_table
- create tmp_table as ( incremental sql )
- merge into table use tmp_table
delete + insert 的增量流程是有问题的
- 会出现原表中的数据被删除但新的数据没进来的情况
- 例如程序A执行完 delete 操作,程序B 执行完 drop tmp_table,此时程序A insert 是失败的,于是就导致了旧数据被删除了,但新数据没插入的情况。
- 表是有一段时间查不到数据
- 因为 delete 和 insert 是俩步操作,在<delete, insert> 这间隔内,此时查询表内数据,是查不到数据的。
但 merge 模型下的增量写入就没有上述的问题,原因是 merge 是原子性操作,所以更新数据时候不会存在删数据和插数据的间隔,于是就能避免以上问题。
dbt 创建tmp表也是一个很妙的地方,通过 tmp 表能实现增量写入是原子操作
例如在 merge 模式下,并发执行增量程序,会出现以下执行异常:
- tmp_table is exist
- 俩程序在同时在执行 create_tmp,执行慢的那个便会创建 tmp 表失败,于是便没有 merge 操作。
- tmp_table is not exist
- 程序A 创建好的 tmp 表,被程序B drop 掉。于是程序A的 merge 操作失败,程序B 继续执行。
通过以上俩个异常,能保证 dbt 不管在什么情况下,只有一个增量程序在执行。
总结
以上便是 dbt 增量模型的一些细节,我们在选择 dbt 做增量时,要尽量选择 merge 模式。如果是自己想要实现增量写入,也可以参考 dbt merge 模型的流程。
深入理解 dbt 增量模型的更多相关文章
- 《深入理解Java内存模型》读书总结
概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括"并发.同步.主内存.本地内存.重排序.内存屏障.happens befo ...
- 深入理解java内存模型系列文章
转载关于java内存模型的系列文章,写的非常好. 深入理解java内存模型(一)--基础 深入理解java内存模型(二)--重排序 深入理解java内存模型(三)--顺序一致性 深入理解java内存模 ...
- 【Todo】【转载】深入理解Java内存模型
提纲挈领地说一下Java内存模型: 什么是Java内存模型 Java内存模型定义了一种多线程访问Java内存的规范.Java内存模型要完整讲不是这里几句话能说清楚的,我简单总结一下Java内存模型的几 ...
- 深入理解Java内存模型(一)——基础(转)
转自程晓明的"深入理解Java内存模型"的博客 http://www.infoq.com/cn/articles/java-memory-model-1 并发编程模型的分类 在并发 ...
- 理解CSS盒子模型
概述 网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin),CSS盒子模型都具备这些属性,也主要是这些属性. 这些属性我们可以把它转移到我 ...
- <转>HTML+CSS总结/深入理解CSS盒子模型
原文地址:http://www.chinaz.com/design/2010/1229/151993.shtml 前言:前阵子在做一个项目时,在页面布局方面遇到了一点小问题,于是上stackoverf ...
- 深入理解Java内存模型之系列篇[转]
原文链接:http://blog.csdn.net/ccit0519/article/details/11241403 深入理解Java内存模型(一)——基础 并发编程模型的分类 在并发编程中,我们需 ...
- 【深入理解Java内存模型】
深入理解Java内存模型(一)--基础 深入理解Java内存模型(二)--重排序 深入理解Java内存模型(三)--顺序一致性 深入理解Java内存模型(四)--volatile 深入理解Java内存 ...
- 全面理解Java内存模型(JMM)及volatile关键字(转载)
关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoad ...
- 理解 LDA 主题模型
前言 gamma函数 0 整体把握LDA 1 gamma函数 beta分布 1 beta分布 2 Beta-Binomial 共轭 3 共轭先验分布 4 从beta分布推广到Dirichlet 分布 ...
随机推荐
- AspNetCore中 使用 Grpc 简单Demo
为什么要用Grpc 跨语言进行,调用服务,获取跨服务器调用等 目前我的需要使用 我的抓取端是go 写的 查询端用 Net6 写的 导致很多时候 我需要把一些临时数据写入到 Redis 在两个服务器进行 ...
- go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控
0.转载 go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控 0.1源码地址 https://github.com/liuyuede123/ ...
- LcdToos如何在线对屏进行读写指令调试
在实际屏调试过程中,工程师经常需要对屏的寄存器频繁进行参数修改和读取测试,LcdTools针对这个做了很好的支持,可以在线进行指令调试,大大提高调试效率. 打开点屏工程,连接PX01并使模组上电点亮. ...
- 盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!
摘要:基于昇腾AI异构计算架构CANN(Compute Architecture for Neural Networks)的简易版辅助驾驶AI应用,具备车辆检测.车距计算等基本功能,作为辅助驾驶入门级 ...
- Optimize(优化实验)
十大优化法则 1.更快(本课程重点!) 2.更省(存储空间.运行空间) 3.更美(UI 交互) 4.更正确(本课程重点!各种条件下) 5.更可靠 6.可移植 7.更强大(功能) 8.更方便(使用) 9 ...
- Spark基本知识
Spark基本知识 Spark 是一种基于内存的快速.通用.可扩展的大数据分析计算引擎. spark与hadoop的区别 Hadoop Hadoop 是由 java 语言编写的,在分布式服务器集群上存 ...
- BI系统打包Docker镜像及部署的技术难度和实现
BI系统打包Docker镜像及部署的技术难度和实现 随着容器化技术盛行,Docker在前端领域也有着越来越广泛的应用:传统的前端部署方式需要我们将项目打包生成一系列的静态文件,然后上传到服务器,配置n ...
- VUE学习2
目录分析 public目录 index.html是起始的html文件 # 这是关键 <div id="app"></div> src目录 main.js是V ...
- Pwn学习随笔
Pwn题做题流程 使用checksec检查ELF文件保护开启的状态 IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试) 编写python的exp脚本进行攻击 (若攻击不成功)进行GDB动态调试 ...
- elasticsearch多字段聚合实现方式
目录 1.背景 2.实现多字段聚合的思路 3.需求 4.数据准备 4.1 创建索引 4.2 准备数据 5.实现方式 5.1 multi_terms实现 5.1.1 dsl 5.1.2 java 代码 ...