雪花是云托管的关系数据库,用于按需创建数据仓库。数据仓库中的数据可以按全负载或增量负载加载。完全加载是一个删除所有现有数据并重新加载的过程。与增量加载相比,完全加载是耗时和消耗资源的任务,增量加载只加载少量的新数据或更新数据,而不是每次都加载完整数据。我们可以通过使用Stream和Merge对象实现变更数据捕获(CDC)来实现雪花中的增量加载。Stream对象用于更改数据捕获,其中包括插入、更新和删除,以及关于每个更改的元数据,以便使用更改的数据采取操作。然后使用匹配和不匹配条件将使用流捕获的数据合并到目标表。
什么是流和合并?
合并- - - - - -
Merge is命令用于对表执行一些更改,更新现有记录,删除旧的/不活动的记录,或从另一个表中添加新行。
Snowflake提供了两个子句来执行Merge:
- Matched子句—当行满足条件时,Matched子句对目标表执行Update和Delete操作。
- 未匹配子句—未匹配子句在满足条件的行未匹配时执行插入操作。源表中与目标表不匹配的行将被插入。
流- - - - - -
流是在源的顶部创建的表,用于捕获变更数据;它跟踪对源表行所做的更改。
创建的流对象只保存可以跟踪更改数据捕获的偏移量,然而,源中的主要数据保持不变。
在流中向源表添加3个额外的列
列 |
描述 |
---|---|
美元元数据操作 |
它可能只有两个值Insert/Delete |
元数据ISUPDATE美元 |
如果记录被更新,这将被标记为True |
元数据ROW_ID美元 |
对于每个更改,将跟踪惟一的散列键。 |
现在我们知道什么是流和合并,让我们看看如何使用流和合并来加载数据-
步骤1 -
连接到Snowflake DB并创建示例源表和目标表
步骤2 -
使用下面的查询-在源表上创建流
步骤3- - - - - -
让我们在源表中插入一些虚拟数据-
在将数据插入到源之后,让我们检查在流中捕获的数据-
当我们第一次在源中插入数据时,新插入的行将在METADATA$ACTION列中被标记为INSERT,而METADATA$UPDATE在流中被标记为FALSE。
第四,
插入数据到目标使用流和合并使用以下查询-
当我们第一次插入数据时,将不会有任何匹配personal_id在目标表中,并且由于METADATA$ACTION标志是INSERT, merge命令将把整个数据插入到目标表中。
顾不上- - - - - -
让我们更新一些源行,并将它们再次加载到target-
一旦我们更新源表,流将捕获这些更改并更新流数据。
在METADATA$ACTION列中,更新的行将被标记为INSERT,我们更新的旧行将被标记为Delete。这样当我们从源加载更新数据到目标时,包含那格浦尔市的旧行将被删除,包含孟买市的新行将被插入。
再次运行我们之前使用的相同的stream和merge命令,只在目标中加载更新的数据,更新的目标数据将看起来像这样-
在这里,您已经成功地使用雪花实现了增量加载。
为了使加载过程自动化,我们可以创建一个任务,该任务将在指定的时间间隔后运行,并在源发生任何更改时将数据加载到目标中。
阅读的快乐!
我从上周开始看雪花,这个博客对我理解合并声明很有帮助。
非常感谢楼主的分享。
非常有用的. .
嘿,普拉福,
我已经通过创建雪花流和合并语句实现了增量操作,它完美地工作良好的数据量在目标表中的9.5亿行。
增量检查非常快,使用Size = XSMALL的Warehouse在2分钟内执行上传和删除操作。
只是一个查询,如果我们想要按小时调度执行这个过程,我们需要使用雪花任务或其他方式来调度这个过程吗?