要求:仅需要每天获取最新文件(此处为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');
答案 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