如何计划 Athena 查询?

上次更新时间:2020 年 5 月 21 日

如何在 Amazon Athena 中计划查询?

简短描述

计划查询在许多情况下都很有用,例如运行定期报告查询或定期加载新分区。您可以通过以下方法在 Athena 中计划查询:

使用所选的开发工具包创建 AWS Lambda 函数,以计划查询。有关 Lambda 支持的编程语言的更多信息,请参阅 AWS Lambda 常见问题。然后,创建 Amazon CloudWatch Events 规则以计划 Lambda 函数。这是“解决方案”中所述的方法。
如果您在 ETL 管道中使用 Athena,请使用 AWS Step Functions 创建管道并计划查询。 在 Linux 计算机上,使用 crontab 计划查询。 使用 AWS Glue Python shell 作业来通过 Athena boto3 API 运行 Athena 查询。然后,为 AWS Glue 作业定义计划。

解决方法

要使用 Lambda 函数和 CloudWatch Events 规则计划 Athena 查询,请执行以下操作:

1. 为 Lambda 创建 AWS Identity and Access Management (IAM) 服务角色。然后,附加一个允许访问 Athena、Amazon Simple Storage Service (Amazon S3) 和 Amazon CloudWatch Logs 的策略。例如,您可以为角色添加 AmazonAthenaFullAccess 和 CloudWatchLogsFullAccess。AmazonAthenaFullAccess 允许完全访问 Athena 并包含 Amazon S3 的基本权限。CloudWatchLogsFullAccess 允许完全访问 CloudWatch Logs。

2.打开 Lambda 控制台。

3. 选择创建函数

4.确保选择了从头开始创作,然后配置以下选项:

对于名称,输入函数名称。
对于运行时,选择其中一个 Python 选项。
对于角色,选择使用现有角色,然后选择您在步骤 1 中创建的 IAM 角色。

5.选择创建函数

6. 在函数代码部分中粘贴您的代码。以下示例使用 Python 3.7。替换示例中的以下值:

默认:Athena 数据库名称
SELECT * FROM default.tb:您想要计划的查询
s3://AWSDOC-EXAMPLE-BUCKET/:用于查询输出的 S3 存储桶

import time
import boto3

query = 'SELECT * FROM default.tb'
DATABASE = 'default'
output='s3://AWSDOC-EXAMPLE-BUCKET/'

def lambda_handler(event, context):
    query = "SELECT * FROM default.tb"
    client = boto3.client('athena')

    # Execution
    response = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={
            'Database': DATABASE
        },
        ResultConfiguration={
            'OutputLocation': output,
        }
    )
    return response
    return

7.在页面的右上角,选择保存

8.打开 CloudWatch 控制台。

9.在导航窗格中,选择规则,然后选择创建规则。有关创建 CloudWatch Events 规则的更多信息,请参阅步骤 2:创建规则。

10. 在事件源部分,选择计划,然后输入一个 cron 表达式。

11. 在页面右侧的目标部分,选择添加目标

12. 在下拉列表中,选择 Lambda 函数

13. 在函数下拉列表中,选择 Lambda 函数的名称。

14. 在页面的右下角,选择配置详细信息

15. 为您的 CloudWatch Events 规则输入名称描述,然后选择创建规则

16. 打开 Lambda 控制台,然后选择您之前创建的函数。

17. 选择添加触发器,然后选择 CloudWatch Events/EventBridge

18. 在规则下拉列表中,选择您刚刚创建的 CloudWatch Events 规则。

19. 选择添加

如果您要计划多个查询,请记住,每个账户对 Athena API 的调用次数都有配额。有关更多信息,请参阅每个账户的 API 调用配额。