首页 > 解决方案 > 如何查询雪花阶段元数据的最后修改列

问题描述

我们有一个 aws s3 存储桶,每天都会重写相同的文件。我们需要将该文件加载到今天才加载的雪花中。

复制命令工作正常。但是,当未加载新文件时,它只会加载不需要的前一个文件。相反,它应该抛出一个错误让团队知道。

我们可以查询 last_modified 日期:

ls @stage_name

或者我们可以获取阶段元数据信息。

通过查询

select metadata@filename from @stage_name

但是我找不到任何查询或过滤last_modified阶段列的方法。

标签: snowflake-cloud-data-platform

解决方案


ls 命令是元数据查询。虽然您无法对此进行过滤,但您可以过滤它生成的结果集:

ls @MYSTAGE;
-- You must run this immediately after the previous query in the same session
select * from table(result_scan(last_query_id())); 

但是有两个并发症。首先,元数据列的名称是小写的,因此请确保在过滤器中使用小写名称并将它们用双引号引起来。第二个问题是日期字段的格式不适合在查询中过滤。为了解决这个问题,我编写了一个 UDF 来将 last_modified 字段转换为时间戳以便于过滤:

-- Convert the last modified value from the Snowflake LIST
-- command into a timestamp.
create or replace function LAST_MODIFIED_TO_TIMESTAMP(LAST_MODIFIED string) 
returns timestamp_tz
as
$$
    to_timestamp_tz(left(LAST_MODIFIED, len(LAST_MODIFIED) - 4) || ' ' || '00:00', 'DY, DD MON YYYY HH:MI:SS TZH:TZM')
$$;

然后你可以像这样过滤结果:

ls @TESTSTAGE;

select * from table(result_scan(last_query_id())) 
where LAST_MODIFIED_TO_TIMESTAMP("last_modified") < '2020-11-01' ;

推荐阅读