Snowflake cloud data platform 如何从Snowflake外部S3阶段获取文件名列表?

Snowflake cloud data platform 如何从Snowflake外部S3阶段获取文件名列表?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我正在寻找最好的方法来自动检测S3存储桶中的新文件,然后将数据加载到雪花表中 我知道这可以通过AWS中设置的Snowpipe和SNS、SQS通知来实现,但我希望Snowflake中有一个可用于多个数据源的自包含解决方案 我希望有一个表,该表使用S3存储桶中的文件名进行更新,然后将尚未从S3加载的文件加载到Snowflake中 到目前为止,我发现在Snowflake中自动检测来自外部S3阶段的新文件的唯一方法是使用下面的代码和一个固定时间表上的任务。这将列出文件名,然后使用结果扫描将最后一个查询显

我正在寻找最好的方法来自动检测S3存储桶中的新文件,然后将数据加载到雪花表中

我知道这可以通过AWS中设置的Snowpipe和SNS、SQS通知来实现,但我希望Snowflake中有一个可用于多个数据源的自包含解决方案

我希望有一个表,该表使用S3存储桶中的文件名进行更新,然后将尚未从S3加载的文件加载到Snowflake中

到目前为止,我发现在Snowflake中自动检测来自外部S3阶段的新文件的唯一方法是使用下面的代码和一个固定时间表上的任务。这将列出文件名,然后使用结果扫描将最后一个查询显示为表

list @STAGE_NAME;
set qid=last_query_id();
select "name" from table(result_scan($qid))

有没有人知道一种更好的方法可以从Snowflake自动检测外部阶段中的新文件?非常感谢您提供的任何帮助。

不一定比您已经找到的方法更好,但是有一种替代方法可以在S3存储桶中列出文件

如果在S3中为数据创建一个属性,那么可以在查询中使用该属性。如果您有已加载到Snowflake中的文件的记录,则可以比较和选择新文件的名称并对其进行处理

e、 g


不一定比您已经找到的方式更好,但是有另一种方法可以在S3存储桶中列出文件

如果在S3中为数据创建一个属性,那么可以在查询中使用该属性。如果您有已加载到Snowflake中的文件的记录,则可以比较和选择新文件的名称并对其进行处理

e、 g

短期: 你的方法 您已经找到了一个可行的解决方案,您对最后一个查询id函数的可靠性的担忧是可以理解的。过程的会话是隔离的,因此最后一个\u query\u id()函数将仅隔离到该过程中执行的语句。可能不需要使用过程,但我个人喜欢它们让您创建可重用的抽象

另一种方法 如果您不喜欢所使用的方法,另一种方法是创建一个表,其中包含一个变量数据列和阶段元数据列,由一个巨型管道维护,您可以在该表上维护一组物化视图,这些视图将过滤、将变量字段转换为列并进行清理,视情况而定

有一些好处:

  • 更简单:为阶段集成新前缀只需要额外的物化视图,而不需要额外的管道+任务
  • 更多控制:您可以直接、自动地对原始格式的数据进行操作,而无需加载到表中然后进行检查。这意味着您可以执行数据质量检查、元数据检查和清理
  • 可维护:在不可变的源上使用物化视图意味着您可以随时更改逻辑并轻松执行完全回填
长期: 使snowflake能够监听(并可能在将来通知,如果愿意的话)外部消息传递系统。目前只支持Azure,因此它对您的情况不起作用,但请在接下来的几个月内密切关注--我认为可以肯定的是,我们将看到此功能扩展到支持AWS,并且最终将提供一种更直接、更简洁的方式来实现您的原始解决方案。

短期: 你的方法 您已经找到了一个可行的解决方案,您对最后一个查询id函数的可靠性的担忧是可以理解的。过程的会话是隔离的,因此最后一个\u query\u id()函数将仅隔离到该过程中执行的语句。可能不需要使用过程,但我个人喜欢它们让您创建可重用的抽象

另一种方法 如果您不喜欢所使用的方法,另一种方法是创建一个表,其中包含一个变量数据列和阶段元数据列,由一个巨型管道维护,您可以在该表上维护一组物化视图,这些视图将过滤、将变量字段转换为列并进行清理,视情况而定

有一些好处:

  • 更简单:为阶段集成新前缀只需要额外的物化视图,而不需要额外的管道+任务
  • 更多控制:您可以直接、自动地对原始格式的数据进行操作,而无需加载到表中然后进行检查。这意味着您可以执行数据质量检查、元数据检查和清理
  • 可维护:在不可变的源上使用物化视图意味着您可以随时更改逻辑并轻松执行完全回填
长期:
使snowflake能够监听(并可能在将来通知,如果愿意的话)外部消息传递系统。目前只支持Azure,因此它对您的情况不起作用,但请在接下来的几个月内密切关注--我认为可以放心地推测,我们将看到此功能扩展到支持AWS,并且最终将提供一种更直接、更简洁的方式来实现您的原始解决方案。

据我所知,这是唯一的方法。Snowippe和使用任务以及结果扫描是唯一的方法!谢谢关于这种方法,我关心的一个问题是如何确保最后一次查询运行始终是list语句。将其放在一个过程中是否可以确保它始终捕获正确的ID?在将此与任务和过程相结合时,您是否遇到过任何困难?据我所知,这是唯一的方法。Snowippe和使用任务以及结果扫描是唯一的方法!谢谢一个c
ALTER EXTERNAL TABLE MYSCHEMA.MYEXTERNALTABLE REFRESH;

SELECT DISTINCT
   METADATA$FILENAME as filename
FROM 
   MYSCHEMA.MYEXTERNALTABLE;