【问题标题】:Snowpipe: Importing historical data that may be modified without causing re-importsSnowpipe:导入可能被修改的历史数据而不会导致重新导入
【发布时间】:2020-02-20 01:35:02
【问题描述】:

首先,我不确定 Snowpipe 的现有功能是否可以做到这一点。

我有一个包含多年数据的 S3 存储桶,有时其中一些文件会更新(内容会发生变化,但文件名保持不变)。我希望使用 Snowpipe 将这些文件导入 Snowflake,因为“我们不会重新导入已修改的文件”方面对我很有吸引力。

但是,我发现ALTER PIPE ... REFRESH 只能用于导入不早于 7 天前上演的文件,而 Snowflake 文档中唯一其他关于导入历史数据的建议是使用 COPY INTO ...但是,如果我使用它,那么如果这些旧文件被修改,它们会通过 Snowflake 导入,因为阻止 COPY INTO ... 重新导入 S3 文件的元数据和 Snowpipe 的元数据不同,所以我可以将那个文件导入两次。

除了“修改所有 S3 中的这些文件,使它们具有最近修改的时间戳”之外,是否有任何方法可以让我使用 Snowpipe?

【问题讨论】:

  • ALTER PIPE...REFRESH 也只会加载尚未加载的文件。它旨在解决短期问题,而不是处理常规生产模式。不过,我对您的问题感到有些困惑。是否要重新加载修改过的文件?
  • 我希望重新加载修改为 not 的文件。我只会使用一次ALTER PIPE ... REFRESH,以获取 Snowpipe 无法获取的任何过去数据。
  • 我明白了,所以担心这些文件可能超过 7 天,您想找到一种方法让 ALTER PIPE ... REFRESH 找到它们?您知道需要加载哪些文件丢失了吗?
  • 要么我想让ALTER PIPE ... REFRESH 找到它们,这样如果它们在未来被编辑,Snowpipe 就不会重新摄取它们,或者其他导致与 Snowpipe 相同情况的方法.根据我对文档的理解,ALTER PIPE ... REFRESH 只需要最后 7 天的暂存文件,所以我想在此之前加载所有内容(例如,从 2018 年 1 月 1 日到 7 天前)。
  • 我还有 1 个问题,因为我不确定 Snowpipe 是否真的适合您想要做的事情。您的 S3 存储桶包含偶尔会更新的历史数据……是直接利用并由其他东西更新的数据湖吗?一旦将文件加载到 Snowflake 中,您是否可以移动文件?您的问题有很多解决方案,我只是想确保提供一种适合您环境的解决方案。

标签: snowflake-cloud-data-platform


【解决方案1】:

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

我已多次使用此方法从 AWS S3 位置回填历史数据,在该位置我们已在其中写入数据后启用了 Snowpipe 摄取。即使在您不必担心文件被更新到位的情况下,这仍然比直接回退到直接 COPY INTO 更有优势,因为您不必担心当首次启用 PIPE 后,您推送到 Snowpipe REST API 的文件集将由 PIPE 加载历史记录为您处理。

【讨论】:

    猜你喜欢
    • 2022-11-28
    • 2020-01-11
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2014-11-03
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多