如何更改存储在 S3 中的 Athena 结果的名称?

How to change the name of the Athena results stored in S3?

Athena查询的结果通过query id(一长串)保存在S3中。我想知道是否有办法用预先指定的名称保存查询结果? (以后可以很容易地查到)

对于命名查询,您的结果位置结构如下:

s3://athena-query-results-<account>-<region>/<query-name>/<year>/<month>/<day>/<UUID>.csv

我不知道客户端指定UUID的任何方法。但是您可以在命名查询的 s3 文件夹中查找最新文件。

或者,您可以使用 s3 API 或 aws cli 将结果复制到您选择的位置。

这是否回答了您的问题?

不幸的是没有(至少现在还没有)!到目前为止,执行此操作的最佳方法是编写一个脚本来遍历每个 运行 的所有结果并重命名(移动+删除)该 s3 存储桶中的所有文件!

您可以通过一个简单的 AWS Lambda 函数来实现。

Change names of AWS Athena results stored in S3 bucket

client = boto3.client('athena')
s3 = boto3.resource("s3")

#run query 
queryStart = client.start_query_execution(
    QueryString = '
      #PUT_YOUR_QUERY_HERE
      SELECT *
      FROM "db_name"."table_name"
      WHERE value > 50
    ',
    QueryExecutionContext = {
      'Database': "covid_data" //YOUR_ATHENA_DATABASE_NAME
    },
    ResultConfiguration = {
      #query result output location you mentioned in AWS Athena
      "OutputLocation": "s3://bucket-name-X/folder-Y/"
    }
  )

#executes query and waits 3 seconds
queryId = queryStart['QueryExecutionId']
time.sleep(3)

#copies newly generated csv file with appropriate name
#query result output location you mentioned in AWS Athena
queryLoc = "bucket-name-X/folder-Y/" + queryId + ".csv"

#destination location and file name
s3.Object("bucket-name-A", "report-2018.csv").copy_from(CopySource = queryLoc)

#deletes Athena generated csv and it's metadata file
response = s3.delete_object(
    Bucket='bucket-name-A',
    Key=queryId+".csv"
)
response = s3.delete_object(
    Bucket='bucket-name-A',
    Key=queryId+".csv.metadata"
)
print('{file-name} csv generated')
def delete_metadata():
    s3 = boto3.resource('s3')
    client_s3 = boto3.client('s3')
    bucket = s3.Bucket('testing')
    for obj in bucket.objects.filter(Prefix='prepared/'):
        if obj.key.endswith('.metadata'):
            print(obj.key)
            client_s3.delete_object(Bucket=bucket.name,Key=obj.key)