从 s3 存储桶中获取 AWS athena 查询结果文件

AWS athena query result file fetching from s3 bucket

目前我正在研究 AWS Athena。我们有一个网页将显示查询结果。存储在 s3 存储桶中的数据作为数据湖 AWS Glue 的一部分被摄取。

从我们的网页多个 requests/query 将被扔到 AWS Athena。由于这是实时查询,我在此过程中没有保存查询,我使用 lambda 函数执行从网页传递的查询,然后显示结果。

现在我可以在 lambda 输出屏幕上看到 json 格式的结果,我们计划获取存储在 s3 中的输出文件并将其推送到网页。我们面临的限制是每个查询结果都以唯一的 UUID 文件名存储在 s3 中,当多个请求命中时,我们如何从 s3 存储桶中获取该数据。

我想到了创建新文件的想法,但是对于一次来自多个地方的多个请求,我们不能使用该概念,我找不到任何雅典娜 api 也可以获取输出文件。

我想到的第二件事是请求 ID,但我在输出文件中找不到任何对请求 ID 的引用。请提出建议。

我是 Athena 服务的新手。提前致谢:)

您可以做的一件事是在开始查询时使用 "client request token"。这将告诉 Athena,如果相同的 SQL 已经 运行 具有相同的标记,它不应该再次 运行 查询,而是 return 之前的查询执行 ID。参见 StartQueryExecution/ClientRequestToken

工作原理如下:假设您 运行 查询 SELECT foo FROM bar。如果您 运行 此查询两次,第一次 StartQueryExecution API 调用将 return 与第二次不同的查询执行 ID。但是,如果您通过两个 API 调用传递客户端请求令牌,则两个调用将 return 相同的查询执行 ID。无论查询是否完成,这都有效,所发生的只是您获得相同的查询执行 ID。然后,当您执行 GetQueryExecution 时,您将获得查询的状态,如果完成,您将获得输出位置——这将是相同的。

客户端请求令牌功能是一种缓存机制,与所有缓存一样,考虑失效很重要。 Athena 不知道您的基础数据是否已更改,因此您应该注意使用会在数据更改时更改的令牌,例如通过包含时间戳。当我没有更好的办法时,我所做的是散列 SQL 并附加一个四舍五入到最近的小时(或五分钟,或接近基础数据刷新频率的某个时间段)的时间戳。