分析

如何实现增量加载在雪花使用流和合并

同事们坐在办公室的办公桌前看着笔记本电脑。库存图片

雪花是云托管的关系数据库,用于按需创建数据仓库。数据仓库中的数据可以按全负载或增量负载加载。完全加载是一个删除所有现有数据并重新加载的过程。与增量加载相比,完全加载是耗时和消耗资源的任务,增量加载只加载少量的新数据或更新数据,而不是每次都加载完整数据。我们可以通过使用Stream和Merge对象实现变更数据捕获(CDC)来实现雪花中的增量加载。Stream对象用于更改数据捕获,其中包括插入、更新和删除,以及关于每个更改的元数据,以便使用更改的数据采取操作。然后使用匹配和不匹配条件将使用流捕获的数据合并到目标表。

什么是流和合并?

合并- - - - - -

Merge is命令用于对表执行一些更改,更新现有记录,删除旧的/不活动的记录,或从另一个表中添加新行。

Snowflake提供了两个子句来执行Merge:

  1. Matched子句—当行满足条件时,Matched子句对目标表执行Update和Delete操作。
  2. 未匹配子句—未匹配子句在满足条件的行未匹配时执行插入操作。源表中与目标表不匹配的行将被插入。

- - - - - -

流是在源的顶部创建的表,用于捕获变更数据;它跟踪对源表行所做的更改。

创建的流对象只保存可以跟踪更改数据捕获的偏移量,然而,源中的主要数据保持不变。

在流中向源表添加3个额外的列


描述
美元元数据操作
它可能只有两个值Insert/Delete
元数据ISUPDATE美元
如果记录被更新,这将被标记为True
元数据ROW_ID美元
对于每个更改,将跟踪惟一的散列键。

现在我们知道什么是流和合并,让我们看看如何使用流和合并来加载数据-

步骤1 -

连接到Snowflake DB并创建示例源表和目标表

Capture1

步骤2 -

使用下面的查询-在源表上创建流

Picture2

步骤3- - - - - -

让我们在源表中插入一些虚拟数据-

Picture3

在将数据插入到源之后,让我们检查在流中捕获的数据-

Picture4

当我们第一次在源中插入数据时,新插入的行将在METADATA$ACTION列中被标记为INSERT,而METADATA$UPDATE在流中被标记为FALSE。

第四,

插入数据到目标使用流和合并使用以下查询-

Picture5

当我们第一次插入数据时,将不会有任何匹配personal_id在目标表中,并且由于METADATA$ACTION标志是INSERT, merge命令将把整个数据插入到目标表中。

Picture6

顾不上- - - - - -

让我们更新一些源行,并将它们再次加载到target-

Picture7

一旦我们更新源表,流将捕获这些更改并更新流数据。

Picture8

在METADATA$ACTION列中,更新的行将被标记为INSERT,我们更新的旧行将被标记为Delete。这样当我们从源加载更新数据到目标时,包含那格浦尔市的旧行将被删除,包含孟买市的新行将被插入。

再次运行我们之前使用的相同的stream和merge命令,只在目标中加载更新的数据,更新的目标数据将看起来像这样-

Picture9

在这里,您已经成功地使用雪花实现了增量加载。

为了使加载过程自动化,我们可以创建一个任务,该任务将在指定的时间间隔后运行,并在源发生任何更改时将数据加载到目标中。

阅读的快乐!

关于“如何使用流和合并在雪花中实现增量加载”的思考

  1. 我从上周开始看雪花,这个博客对我理解合并声明很有帮助。
    非常感谢楼主的分享。

  2. 嘿,普拉福,

    我已经通过创建雪花流和合并语句实现了增量操作,它完美地工作良好的数据量在目标表中的9.5亿行。
    增量检查非常快,使用Size = XSMALL的Warehouse在2分钟内执行上传和删除操作。

    只是一个查询,如果我们想要按小时调度执行这个过程,我们需要使用雪花任务或其他方式来调度这个过程吗?

留言回复

您的电邮地址将不会公布。必填项已标记

这个网站使用Akismet来减少垃圾邮件。了解如何处理您的评论数据

Praful Pelne

Praful是一个数据爱好者,在ETL工具、数据治理、数据仓库和SQL方面有5年的经验。

更多来自作者

关注我们
推特 Linkedin 脸谱网 Youtube Instagram