从 s3 存储桶提取的 AWS 雅典娜查询结果文件



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

在我们的网页上,多个请求/查询将被抛出到 AWS Athena。由于这是实时查询,因此我在此过程中不会保存查询,而是使用 lambda 函数执行从网页传递的查询,然后显示结果。

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

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

我想到的第二件事是请求 id,但我在输出文件中找不到对请求 id 的任何引用。请指教。

我是雅典娜服务的新手。提前致谢:)

您可以做的一件事是在启动查询时使用"客户端请求令牌"。这将告诉 Athena,如果使用相同的令牌运行了相同的 SQL,则它不应再次运行查询,而是返回之前的查询执行 ID。请参阅StartQueryExecution/ClientRequestToken

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

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

最新更新