如何将输入文件名作为AWS Athena外部表中的列

59

我在AWS Athena中创建了外部表以查询S3数据,但是路径中有1000多个文件。因此,我需要在表格中显示记录的相应文件名作为列。

select file_name , col1 from table where file_name = "test20170516"

简而言之,我需要知道在AWS Athena Presto中与INPUT__FILE__NAME(hive)等效的内容,或任何其他实现相同目的的方法。

2个回答

100
你可以使用 $path 伪列来完成这个操作。
select "$path" from table

1
非常感谢您提供的信息。请问您能否提供任何相关链接?我已经搜索了一段时间,但没有找到任何有用的信息。 - Rajeev
4
我曾经通过以下 Github 问题找到它。 https://github.com/prestodb/presto/issues/5486 - jens walter
7
再次感谢。你知道其他类似的伪列吗? - Rajeev
3
请参考官方AWS文档中的答案:“如何查看Athena表中一行的Amazon S3源文件”:https://aws.amazon.com/en/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/ - Sma Ma
顺便说一下,这在presto-sql 316版本(可能更早)中有效。因此,这是一个presto功能,而不仅仅是Athena功能。我不知道这个,但拥有它真的很棒 - 谢谢! - John Humphreys
1
虽然这种情况并不常见,因为分区应该几乎所有时候都会被使用,但值得注意的是,在非分区表中,$path变量是不可用的。 - Harfel Jaquez

27

如果你只需要文件名,可以使用regeexp_extract()进行提取。

要在Athena中使用它在"$path"上,你可以这样做:

SELECT regexp_extract("$path", '[^/]+$') AS filename from table;

如果您需要没有扩展名的文件名,可以执行以下操作:

SELECT regexp_extract("$path", '[ \w-]+?(?=\.)') AS filename_without_extension from table;

这是关于Presto正则表达式函数的文档。


3
我曾使用 split_part("$PATH",'/',7) 获取文件名,不过你的方法更通用。谢谢。 - Rajeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接