提问者:小点点

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


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

我知道这可以使用雪花管和SNS来实现,在AWS中设置了SQS通知,但我希望在雪花中有一个独立的解决方案,可以用于多个数据源。

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

到目前为止,我发现的从雪花中的外部S3阶段自动检测新文件的唯一方法是使用下面的代码和设定的计划任务。这将列出文件名,然后使用result_scan将最后一个查询显示为表。

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

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


共2个答案

匿名用户

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

如果在S3中的数据上创建外部表,则可以在查询中使用元数据$FILENAME属性。如果您有已加载到Snowflake中的文件的记录,则可以比较和选择新文件的名称并对其进行处理。

例如

ALTER EXTERNAL TABLE MYSCHEMA.MYEXTERNALTABLE REFRESH;

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

匿名用户

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

如果您不喜欢您正在使用的方法,另一种选择是创建一个包含单个VARIANT数据列和阶段元数据列的单一表,由单个巨型管道维护,并且您可以在该表上维护一组实例化视图将过滤,将变量字段转换为列,并根据需要进行清理。

有一些好处:

  • 更简单:集成一个阶段的新前缀只需要一个额外的实例化视图,而不是一个额外的管道任务
  • 更多的控制:您将能够直接和自动地对原始形式的数据进行操作,而不需要加载到表中然后检查它。这意味着您可以执行数据质量检查、元数据检查和清理。
  • 可维护:在不可变的源代码上使用实例化视图意味着您可以随时更改逻辑并轻松执行完整的回填。

通知集成使snowflake能够监听(将来可能还会通知,如果愿意的话)外部消息传递系统。目前只支持Azure,因此它对您的情况不起作用,但请在接下来的几个月内密切关注--我认为可以放心地推测,我们将看到此功能扩展到支持AWS,并且最终将提供一种更直接、更简洁的方式来实现您的原始解决方案。