雪花:从S3读取模式日期搜索

时间:2020-09-02 20:55:55

标签: snowflake-cloud-data-platform

要求:仅需要每天获取最新文件(此处为20200902文件)

S3中的示例文件:

@stagename/2020/09/reporting_2020_09_20200902000335.gz
@stagename/2020/09/reporting_2020_09_20200901000027.gz

代码:

select distinct metadata$filename from 
@stagename/2020/09/
(file_format=>APP_SKIP_HEADER,pattern=>'.*/reporting_*20200902*.gz');

1 个答案:

答案 0 :(得分:2)

无论文件的命名约定如何,这都将起作用。由于您的文件似乎具有基于日期的命名约定,并且每个时间点都有一个命名约定,因此您可以不必使用日期,因为可以使用名称。您仍然需要使用result_scan方法。

除了使用LIST命令之外,我还没有找到一种在其他阶段获取文件日期的方法。文档说FILE_NAME和FILE_ROW_NUMBER是选择查询中唯一可用的元数据。无论如何,这种方法都会读取数据,而我们只想读取元数据。

由于LIST命令是元数据查询,因此您需要查询result_scan才能使用where子句。

我在处理项目时遇到的最后一个问题:LIST命令中的last_modified日期采用的格式需要较长的转换表达式才能转换为时间戳。我制作了UDF进行转换,以使其更具可读性。如果您希望将表达式直接放在SQL中,也可以。

首先,创建UDF。

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

下一步,列出阶段或阶段的子目录中的文件。

list @stagename/2020/09/

在会话中运行任何其他查询之前,请在最后一个查询ID上运行此查询。如果您明确指定查询ID,则当然可以在24小时内的任何时间运行它。

select "name", 
       "size",
       "md5",
       "last_modified",
       last_modified_to_timestamp("last_modified") LAST_MOD
from table(result_scan(last_query_id()))
order by LAST_MOD desc
limit 1