首页 > 解决方案 > 使用自动摄取 Snowpipes 时,是否有消除重复记录的最佳做法?

问题描述

目前在 Snowflake 中,我们已经配置了一个连接到外部 S3 阶段的自动摄取 Snowpipe,如此所述。这很好用,我们正在将管道中的记录复制到“登陆”表中。最终目标是将这些记录合并到一个最终表中以处理任何重复项,这也很有效。我的问题是如何最好地安全地执行此 MERGE 而不会丢失任何记录?目前,我们每天执行一个数据提取作业,因此通常会出现 Snowpipe 队列为空的点,我们将其用作可以安全继续的指标,但是我们希望转向更频繁的提取越来越难保证在任何给定点都不会摄取新记录。

我们考虑过的事情:

  1. 暂时暂停管道,合并记录,截断登陆表,然后取消暂停管道。我相信这在技术上应该可行,但我不清楚这是与 Snowpipes 一起工作的建议方式。我不确定它们对暂停/取消暂停有多大的弹性,暂停/取消暂停需要多长时间等。我知道暂停的管道在 14 天后可能会变得“陈旧”(链接)但是我们正在谈论关于暂停几分钟,而不是几天。
  2. 以某种方式利用事务。我对 SQL 事务有一个大致的了解,但是我很难确定在这种情况下是否/如何使用它们来保证不会丢失数据。一般的想法是,如果 MERGE 和 DELETE 可以包含在事务中,它可以提供一种安全的方式来全天处理传入的数据,但我不确定这是否属实。
  3. 添加第三个“处理”表和一个将登陆表与处理表交换的任务。交换表的任务可以按计划运行(例如每小时),我相信关键是让条件语句检查登陆表中是否有记录以及处理表是否为空。此时,MERGE 和 TRUNCATE 将关闭处理表,登陆表将继续接收传入的记录。

非常欢迎对这些选项的任何其他见解或完全不同的建议。

标签: snowflake-cloud-data-platform

解决方案


查看记录插入/更新/删除到您的雪管表的表流。然后,您可以将流合并到目标表,然后重置偏移量。使用任务来运行您的合并语句。此外,鉴于它是雪管,在创建流时最好使用仅附加流

但是,我在这里有一个问题,在某些情况下,我们缺少一些行。我们的任务设置为 1 分钟间隔,这可能是部分原因。然而,即使有雪花的支持,我也从未走到尽头。

我们确实注意到的是,使用存储过程、事务以及在合并之前在流上运行选择似乎已经解决了问题,即不再丢失行


推荐阅读