如何从 CLI 使用 AWS/Athena 获取 CSV 文件查询的完整结果?

How to get the full results of a query to CSV file using AWS/Athena from CLI?

我需要使用 AWS/Athena 下载 AWS/Glue/Catalog 上的完整 table 内容。目前我所做的是从仪表板 运行 a select * from my_table 并将结果在本地保存为 CSV 始终来自仪表板。有没有办法使用 AWS/CLI 获得相同的结果?

从文档中我可以看到 https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-results.html 但这不是我需要的。

您无法保存来自 AWS CLI 的结果,但您可以 Specify a Query Result Location 并且 Amazon Athena 会自动将查询结果的副本保存在您指定的 Amazon S3 位置。

然后您可以使用 AWS CLI 下载该结果文件。

您可以 运行 使用 aws athena start-query-execution API call. You will then need to poll with aws athena get-query-execution until the query is finished. When that is the case the result of that call will also contain the location of the query result on S3, which you can then download with aws s3 cp.

通过 AWS CLI 进行 Athena 查询

这是一个示例脚本:

#!/usr/bin/env bash

region=us-east-1 # change this to the region you are using
query='SELECT NOW()' # change this to your query
output_location='s3://example/location' # change this to a writable location

query_execution_id=$(aws athena start-query-execution \
  --region "$region" \
  --query-string "$query" \
  --result-configuration "OutputLocation=$output_location" \
  --query QueryExecutionId \
  --output text)

while true; do
  status=$(aws athena get-query-execution \
    --region "$region" \
    --query-execution-id "$query_execution_id" \
    --query QueryExecution.Status.State \
    --output text)
  if [[ $status != 'RUNNING' ]]; then
    break
  else
    sleep 5
  fi
done

if [[ $status = 'SUCCEEDED' ]]; then
  result_location=$(aws athena get-query-execution \
    --region "$region" \
    --query-execution-id "$query_execution_id" \
    --query QueryExecution.ResultConfiguration.OutputLocation \
    --output text)
  exec aws s3 cp "$result_location" -
else
  reason=$(aws athena get-query-execution \
    --region "$region" \
    --query-execution-id "$query_execution_id" \
    --query QueryExecution.Status.StateChangeReason \
    --output text)
  echo "Query $query_execution_id failed: $reason" 1>&2
  exit 1
fi

如果您的主要工作组有输出位置,或者您想使用也有定义输出位置的不同工作组,您可以相应地修改 start-query-execution 调用。否则,您可能有一个名为 aws-athena-query-results-NNNNNNN-XX-XXXX-N 的 S3 存储桶,它在某个时候由 Athena 创建,并在您使用 UI.

时用于输出。