Snowflake cloud data platform 如何查询雪花阶段元数据最后修改的列

Snowflake cloud data platform 如何查询雪花阶段元数据最后修改的列,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我们有一个aws s3存储桶,每天都在重写相同的文件。 我们需要在snowflake中加载该文件,该文件仅在今天加载 复制命令工作正常。但是,如果没有加载新文件,则只加载不需要的前一个文件。相反,它应该抛出一个让团队知道的错误 我们可以查询上次修改的日期: ls @stage_name 或者我们可以获得阶段元数据信息 询问 select metadata@filename from @stage_name 但是我找不到任何查询或过滤stage的last\u modified列的方法。ls命令

我们有一个aws s3存储桶,每天都在重写相同的文件。 我们需要在snowflake中加载该文件,该文件仅在今天加载

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

我们可以查询上次修改的日期:

ls @stage_name
或者我们可以获得阶段元数据信息

询问

select metadata@filename from @stage_name

但是我找不到任何查询或过滤stage的
last\u modified
列的方法。

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,将上次修改的字段转换为时间戳,以便于过滤:

-- 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' ;
ls@TESTSTAGE;
从表中选择*(结果扫描(上次查询id())
其中上次修改时间戳(“上次修改”)<'2020-11-01';

将后台文件加载到snowflake后,您不能删除它吗?您正在使用的
复制到
命令是什么?我认为你的问题不在于上次修改的日期,而在于你如何处理
COPY
命令中的错误。加载同一个文件不是重复加载,snowflake在执行COPY命令时会抛出错误?@RajibDeb这是个挑战,我们没有删除或移入文件的权限S3@PIG复制同一文件不会引发错误。它只是不加载文件,除非我们使用force=true;如果我们收到错误消息,它将解决问题,因为团队将收到通知。