如何更改S3中存储的雅典娜结果的名称?

时间:2018-07-18 22:47:45

标签: sql amazon-web-services amazon-s3 amazon-athena

Athena查询的结果通过S3中的查询ID(长字符串)保存。我想知道是否可以用预先指定的名称保存查询结果? (以后可以轻松查看)

4 个答案:

答案 0 :(得分:2)

很遗憾,没有(至少现在还没有)!到目前为止,最好的方法是编写一个脚本来检查每次运行的所有结果,然后重命名(移动+删除)该s3存储桶中的所有文件!

答案 1 :(得分:2)

您可以通过简单的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')

答案 2 :(得分:0)

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

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

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

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

这能回答您的问题吗?

答案 3 :(得分:-1)

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)