Snowflake cloud data platform 雪花:从S3读取模式日期搜索

Snowflake cloud data platform 雪花:从S3读取模式日期搜索,snowflake-cloud-data-platform,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,patt

要求:每天只需获取最新的文件,例如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');

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

除了使用LIST命令之外,我还没有找到在stage中获取文件日期的方法。文档说文件名和文件行号是select查询中唯一可用的元数据。无论如何,这种方法读取数据,而我们只想读取元数据

由于LIST命令是元数据查询,因此需要查询结果\u scan才能使用where子句

我在处理一个项目时遇到的最后一个问题是:LIST命令中最后修改的日期的格式需要一个较长的转换表达式才能转换为时间戳。我制作了一个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')
$$;
接下来,列出stage或stage子目录中的文件

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

很好的详细回答,只是一个小提示,我想你可以简化时间戳的阅读,比如时间戳(左(“last_modified”,25),'DY,DD MON YYYY HH:MI:SS')last_MODYes,这会有用的。我的UDF最初打算转换为UTC。