【问题标题】:How to query last modified column of snowflake stage metadata如何查询雪花阶段元数据的最后修改列
【发布时间】:2021-02-24 16:20:52
【问题描述】:

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

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

我们可以查询last_modified日期:

ls @stage_name

或者我们可以获取舞台元数据信息。

查询

select metadata@filename from @stage_name

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

【问题讨论】:

  • 加载到雪花后不能删除阶段文件吗?
  • 您使用的COPY INTO 命令是什么?我认为您的问题不在于 last_modified 日期,而在于您如何处理 COPY 命令中的错误。
  • 加载同一个文件不是重复加载,复制命令时雪花应该抛出错误?
  • @RajibDeb 这就是挑战,我们无权在 S3 中删除或移动文件
  • @PIG 复制同一个文件不会引发错误。它只是不加载文件,除非我们使用 force=true;如果我们收到错误消息,它将解决问题,因为团队会收到通知。

标签: snowflake-cloud-data-platform


【解决方案1】:

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' ;

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2021-10-02
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2022-06-19
    相关资源
    最近更新 更多