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

Posted

技术标签:

【中文标题】如何获取输入文件名作为 AWS Athena 外部表中的列【英文标题】:How to get input file name as column in AWS Athena external tables 【发布时间】:2017-10-16 02:58:36 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

您可以使用 $path 伪列来做到这一点。

select "$path" from table

【讨论】:

非常感谢您提供的信息。请您告诉我与此相关的任何链接,因为我搜索了一段时间但找不到任何链接。 我不久前通过以下 github 问题找到了它。 github.com/prestodb/presto/issues/5486 再次感谢。您是否知道其他类似的伪列? 另见官方 AWS 文档的回答:“我如何查看 Athena 表中一行的 Amazon S3 源文件”:aws.amazon.com/en/premiumsupport/knowledge-center/… 仅供参考,这适用于 presto-sql 版本 316(可能更早)。因此,它是一个 presto 功能,而不仅仅是 Athena 功能。不知道,但是拥有它真是太棒了-谢谢!【参考方案2】:

如果您只需要文件名,可以使用regeexp_extract() 提取它。

要在 "$path" 上的 Athena 中使用它,您可以执行以下操作:

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

如果您需要不带扩展名的文件名,您可以这样做:

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

这是Presto Regular Expression Functions上的文档

【讨论】:

我使用 split_part("$PATH",'/',7) 来获取文件名,不过你的更通用。谢谢。

以上是关于如何获取输入文件名作为 AWS Athena 外部表中的列的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Athena 或 Redshift 获取到 Sage maker 或 AWS Forecast 而不是平面文件

无法从 AWS Redshift 访问 AWS Athena 表

Spark SQL 查询以获取在 AWS S3 中存储为 CSV 的 Athena 表的最后更新时间戳

AWS Athena 无法将 .csv 整数转换为表值

AWS Athena [Presto] 如何仅接收过去 7 天的数据?

AWS Athena 分区获取所有路径