雪花中的溪流:捕获一行的所有更改,而不仅仅是直到现在的净更改?



(代表雪花用户提交 - 希望找到加快解决速度的解决方案(


我们正在研究使用流来实现一个缓慢变化的维度。

以下文章很有帮助,但我们希望找到一种方法来构建更详尽的更改捕获?

  1. https://www.snowflake.com/blog/building-a-type-2-slowly-changing-dimension-in-snowflake-using-streams-and-tasks-part-1/
  2. https://community.snowflake.com/s/article/Building-a-Type-2-Slowly-Changing-Dimension-in-Snowflake-Using-Streams-and-Tasks-Part-2

请考虑以下示例:

1(Insert into MyTable row 1

2(Select * from StreamOfMyTable<====== 按预期返回插入

3(Update MyTable where Row = 1

4(Select * from StreamOfMyTable

仅显示净变化,一个插入 ,包含步骤 3 中的更新值。如果我们要在此处使用流,则无法知道第 1 行曾经具有步骤 1 中给定的值。

在步骤 4 中,我们希望在流中看到步骤 1 中的原始插入和步骤 3 中的更新。这样我们就可以构建更完整的 SCD 类型 2,而不仅仅是使用 DML 操作使用流时的净变化。

我们确实看到了如何通过时间旅行,通过使用"before(语句=>'my query guid'("短语来创建新的StreamOfMyTableAtSpecificPointInTime。但这似乎很极端,必须为我们所有的表编码。有没有更原生的方式来捕获所有更改?

注意:
被问到"为什么需要行的先前值来构建 SCD 类型 2?您应该能够根据某个 ID 合并到最终维度中,并更新上一条记录以"关闭它",对吗?以前的值应该在你的最终维度中吗?

我的回答是:"流不包含对同一行的多次更改,只包含对它的净更改。在处理流之前,请尝试多次更新行。请注意,流中只有最终值。


关于如何进行的任何建议?

简单地说,你描述的行为就是 Streams 在 Snowflake 中的工作方式。 它们不被考虑和审计记录的表。

您可以运行任务并以较小的间隔处理流,但如果源表上有多个更改,则在处理流时,流中只有 DML 操作网络可用。

对于给定的唯一记录,您希望源表中的更新速度有多快?

插入和更新来自哪里?

如果要构建 SCD 系统,则应该能够从源获取所有更改(插入、更新和删除(。

然后,不应直接将这些更改应用于目标表,并尝试使用流捕获它们,而应将更改本身记录在事件表中,并直接从事件计算 SCD。

2022 年 9 月,Snowflake 添加了 SYSTEM$STREAM_BACKLOG 函数,允许用户检索流的当前偏移量和当前时间戳之间的表版本集。

每个表版本代表一个 DML 操作(INSERTUPDATEDELETETRUNCATE(,因此您应该能够将每个版本(一次一个(处理到 SCD 表中。

相关内容

最新更新