当前位置: 首页 > news >正文

dbt snapshot命令及应用示例

DBT是一种功能强大的数据转换工具,它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够创建快照,这是跟踪数据随时间变化的一种方法。本文带你一起完成创建和使用dbt快照的过程。

理解缓慢变化维度

缓慢变化维度(scd)是数据仓库中的概念,指的是数据(通常为主数据)随时间缓慢变化方式。它们被称为“缓慢变化”,因为这些变化相对不经常发生,如客户的地址或产品的分类,但这些变化的影响对数据分析来说可能是重大的。

scd通常分为三种类型:

  • 类型1: 这种方法用新数据覆盖旧数据,因此不保留历史记录。
  • 类型2: 这种方法使用新数据添加新记录,并将旧记录保留为历史数据。这是最常见的SCD类型,也是dbt快照实现的SCD类型。
  • 类型3: 这种方法为新数据添加新列,并在原始列中保留旧数据。这种类型不太常见,只在需要查看更改进展的情况下使用。

dbt快照与scd的概念直接相关,特别是类型2 scd。dbt中的快照是一种跟踪数据随时间变化的方法,可以有效地创建每行数据的版本历史记录。创建快照时,dbt将元数据列添加到数据中,包括dbt_valid_fromdbt_valid_to,它们表示记录的特定版本有效的时间范围。

这种机制允许dbt快照实现类型2 scd。当源数据发生更改时,dbt不是覆盖现有记录(类型1)或添加新列(类型3),而是添加带有新数据的新记录(类型2)。快照表中的dbt_valid_fromdbt_valid_to列表示记录的每个版本何时有效,从而允许您跟踪一段时间内更改的完整历史。

实战案例

创建dbt 快照模型

dbt中的快照模型是一种特殊的模型,用于跟踪数据随时间的变化。要创建快照模型,需要在dbt项目的snapshots目录中创建一个新文件。这个文件应该包含一个snapshots块,并定义快照的配置。

下面是一个快照模型的例子,它跟踪用户表中的变化:

{% snapshot users_snapshot %}  {{config(      target_schema='snapshots',      strategy='timestamp',      unique_key='id',      updated_at='updated_at'    )  
}}  select * from raw.users{% endsnapshot %}

在本例中,策略被设置为timestamp,这意味着dbt将基于updated_at列跟踪更改。unique_key设置为id,这是用户表中每一行的唯一标识符。

理解快照策略

在dbt中,创建快照有两种主要策略:时间戳策略和检查策略。

  • 时间戳策略

时间戳策略用于源数据包含时间戳列的情况,该列在记录更改时进行更新。在这种策略中,只要时间戳列比上一次运行快照的时间更近,dbt就会创建一个新的快照记录。当您希望根据更改发生的时间跟踪更改时,此策略非常有用。您可以在前一段中看到时间戳策略的示例。

  • 检查策略

另一方面,当希望根据特定列的值跟踪更改时,可以使用check策略。在此策略中,只要指定列中的值与上次运行快照时不同,dbt就会创建新的快照记录。如果希望根据更改内容而不是更改时间来跟踪更改时,此策略非常有用。

下面是一个使用check策略的快照配置示例:

{% snapshot users_snapshot %}  {{    config(      target_schema='snapshots',      strategy='check',      unique_key='id',      check_cols=['status']    )  
}}  select * 
from raw.users{% endsnapshot %}

在本例中,当用户的**status** 列发生变化时,dbt将创建新的快照记录。为快照选择正确的策略取决于源数据的性质和用例的特定需求。

运行快照模型

一旦创建了快照模型,就可以使用dbt snapshot命令运行它。该命令将执行dbt项目中的所有快照模型,并在数据仓库中创建了新的快照表。

以下是运行快照模型的方法:

dbt snapshot

运行此命令后,您应该在snapshot模式(或在快照配置中指定的目标模式)下的数据仓库中看到新创建的快照表。

快照模型数据

dbt创建的快照表包含数据的完整历史记录,每行表示记录的不同版本。现状可以查询此表,以查看数据随时间的变化情况。

下面是查询示例,显示了对users表状态列的所有更改:

select id, status, dbt_valid_from, dbt_valid_to
from snapshots.users_snapshot
order by id, dbt_valid_from;

该查询将返回一个结果集,其中显示每个status值何时对每个用户有效。

高级快照技术

除了基本的快照功能之外,dbt还提供了一些高级特性,可以帮助您更有效地管理快照。例如,可以使用invalidate_hard_deletes配置选项来跟踪已从源数据中删除的记录。

以下是如何修改前节的示例快照模型来跟踪硬删除:

{% snapshot users_snapshot %}  {{    config(      target_schema='snapshots',      strategy='timestamp',      unique_key='id',      updated_at='updated_at',      invalidate_hard_deletes=True    )  
}}  select * 
from raw.users{% endsnapshot %}

通过这种配置,dbt将为从users表中删除的每条记录在快照表中创建新记录行,dbt_valid_to列设置为删除的时间戳。

最佳实践指南

在使用dbt快照时,您应该遵循以下几个最佳实践:

  • 保持简单: 避免在快照模型中添加复杂的逻辑或连接。如果需要可以在创建快照之后,在下游模型中实现这些逻辑。
  • 为快照配置独立schema: 这样更容易区分快照表和数据仓库中其他类型的表。
  • 确保unique键的唯一性: 在快照配置中指定的unique键应该唯一地标识源数据中的每条记录。

总结

DBT快照是跟踪数据随时间变化的强大工具。通过学习本教程,现在应该对如何创建和使用dbt快照有了较好的理解。期待您的真诚反馈,更多内容请阅读数据分析工程专栏。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络安全-jsp绕过
  • 汽车总线详解
  • 计算器软件设计与实现
  • 1.4 MySql配置文件
  • uniapp js判断key是否在json中?
  • [LLM 学习笔记] Transformer 基础
  • [3]Opengl ES着色器
  • 【数据库选择】选择合适的数据库(MongoDB、PostgreSQL、Couchbase)以支持复杂 JSON 数据的增删改查
  • spring springboot 日志框架
  • 共享wifi公司哪家正规合法?具体流程全公开!
  • B+树(B+TREE)索引
  • 报表做着太费劲?为你介绍四款好用的免费报表工具
  • 安全热点问题
  • vue/配置axios(前后端数据连通/api接口的调用)
  • Java_Day05学习
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • const let
  • Create React App 使用
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript DOM 10 - 滚动
  • JavaScript创建对象的四种方式
  • JavaScript学习总结——原型
  • JAVA多线程机制解析-volatilesynchronized
  • python_bomb----数据类型总结
  • vue 个人积累(使用工具,组件)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 技术:超级实用的电脑小技巧
  • 手机端车牌号码键盘的vue组件
  • 算法-插入排序
  • 系统认识JavaScript正则表达式
  • 用Python写一份独特的元宵节祝福
  • - 转 Ext2.0 form使用实例
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #if #elif #endif
  • #NOIP 2014# day.2 T2 寻找道路
  • $GOPATH/go.mod exists but should not goland
  • (1)Android开发优化---------UI优化
  • (1)无线电失控保护(二)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C11) 泛型表达式
  • (SERIES10)DM逻辑备份还原
  • (八)Flink Join 连接
  • (定时器/计数器)中断系统(详解与使用)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (汇总)os模块以及shutil模块对文件的操作
  • (七)Flink Watermark
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十一)图像的罗伯特梯度锐化
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee