Snowpipe:导入可能被修改的历史数据,而不会引起重新导入。

3
首先,我不确定现有的Snowpipe功能是否可以实现您的需求。
我有一个包含数年数据的S3存储桶,偶尔会更新其中某些文件(文件名不变,但内容会更改)。我希望使用Snowpipe将这些文件导入Snowflake,因为“我们不会重新导入已经被修改的文件”的方面对我很有吸引力。
然而,我发现ALTER PIPE ... REFRESH只能用于导入七天前的数据,而Snowflake文档对导入历史数据的唯一建议是使用COPY INTO ...。但是,如果我使用它,那么如果那些旧文件被修改,它们就会通过Snowflake导入,因为防止COPY INTO ...重复导入S3文件的元数据和Snowpipe的元数据是不同的,所以我最终可能会导入两次同一文件。
除了“修改所有这些文件的S3以便它们具有最近的修改时间戳”之外,是否还有其他方法可以让我在此情况下使用Snowpipe?

ALTER PIPE...REFRESH 还将仅加载尚未加载的文件。它旨在解决短期问题,而不是处理例行生产模式。然而,我对您的要求有些困惑。您是否希望重新加载已修改的文件? - Mike Walton
1
我只有一个问题,因为我不确定Snowpipe是否真的是您想要做的正确工具。您的S3存储桶包含历史数据,有时会更新……那是直接利用并由其他东西更新的数据湖吗?一旦文件加载到Snowflake中,您能否将它们移动?对于您的问题有很多解决方案,我只想确保提供适合您环境的解决方案。 - Mike Walton
如果目标是保持Snowflake表与源表同步,您还可以考虑使用外部表连接到S3存储桶中的文件,然后直接使用该表或从外部表向Snowflake表进行MERGE操作。这将完全避免使用Snowpipe,但如果S3文件发生更改,则外部表也会发生变化。 - Mike Walton
还可以在外部表上创建一个物化视图,使其表现得像一个表。您需要权衡物化视图的成本(存储和计算成本)与合并到实际表中的成本。 - Mike Walton
外部表和物化视图似乎是更干净的解决方案 - 我不认为我目前启用了物化视图,但我会在有机会时进行测试,谢谢! - kwong-yw
显示剩余7条评论
1个回答

0

如果您不反对使用脚本解决此问题,一种解决方案是编写一个脚本从AWS S3中提取范围内对象名称集合,并将其提供给Snowpipes REST API。您可以使用与使用AWS Lambda通过S3事件通知触发调用Snowpipe REST API所需的代码非常相似的代码来完成此操作。您可以使用AWS SDK获取S3中的对象集,或者只需使用Snowflake的LIST STAGE语句来提取它们。

我已经多次使用这种方法从启用了Snowpipe摄入的AWS S3位置回填历史数据,即使在您不必担心文件被原地更新的情况下,这仍然比直接COPY INTO更有优势,因为您不必担心PIPE第一次启用和推送到Snowpipe REST API的文件集之间是否存在重叠,因为PIPE加载历史记录会为您处理这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接