想要实现数据增量写入数据库,可以选择 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 模型的流程。

最新文章

  1. windows插件框架
  2. JQ动画的简单介绍
  3. DEDECMS之三 首页、列表页怎么调用文章内容
  4. 从零开始学Linux[二]:常用操作:用户组、进程、网络、ssh
  5. JavaWeb学习总结(六)—HttpServletResponse
  6. 【AutoMapper】实体类间自动实现映射关系,及其转换。
  7. 编写一个程序实现strlen函数的功能
  8. sqlcipher for android
  9. jquery删除未来项 jquery on
  10. 类 java.util.Scannar方法
  11. 正则 re模块
  12. python 读取默认配置文件和用户配置文件 configs
  13. Angular6+ng-zorro实现登录页面
  14. [leetcode]Surrounded Regions @ Python
  15. 【Unity】7.3 键盘输入
  16. altium designer 快捷键
  17. SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
  18. Android学习CursorWrapper与Decorator模式 (转至http://www.cnblogs.com/bastard/archive/2012/05/31/2527944.html)
  19. shell脚本中,将所有的参数值否赋给一个变量或者说将所有的参数合成一个字符串,获取所有参数
  20. P4622 [COCI2012-2013#6] JEDAN

热门文章

  1. POJ3311 Hie with the Pie(状压DP,Tsp)
  2. 【nginx】使用 nginx 时,使用 sub_filter 注入 js 代码,例如 google analysis 等
  3. vue+element-ui后台管理系统模板
  4. 硬核剖析ThreadLocal源码,面试官看了直呼内行
  5. 10.异步mysql
  6. Hugging Face发布diffuser模型AI绘画库初尝鲜!
  7. Linux--多线程(一)
  8. Debian11管理员手册
  9. Mysql综合实验2-LAMP+MHA+MYcat分库
  10. CSP2022游记