我正在寻找最好的方法来自动检测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自动检测外部阶段中的新文件?非常感谢您的帮助。
不一定比您已经找到的方式更好,但是有另一种方法可以在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,并且最终将提供一种更直接、更简洁的方式来实现您的原始解决方案。