1

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

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

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

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

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

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

4

1 回答 1

2

您可以做的一件事是在开始查询时使用“客户端请求令牌”。这将告诉 Athena,如果使用相同的令牌运行了相同的 SQL,它不应再次运行查询,而是返回上一个查询执行 ID。见StartQueryExecution/ClientRequestToken

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

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

于 2020-06-03T12:54:16.587 回答