Ошибка S3 соединения с AWS Athena Python при попытке получить объект с использованием идентификатора выполнения - PullRequest
0 голосов
/ 02 марта 2019

При попытке прочитать объект S3, который является CSV, ответом является ID выполнения запроса AWS Athena:

def run_query(query, database, s3_output):
    client = boto3.client('athena')
    response = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={
            'Database': database
            },
        ResultConfiguration={
            'OutputLocation': s3_output,
            }
        )
    print('Execution ID: ' + response['QueryExecutionId'])
    return response

response = run_query(query1, db, s3_output)
result = get_exec_status(response)
print(result)

s3_resource = boto3.resource('s3')
s3_client = boto3.client('s3')

def read_s3(path):
    path = path.replace("s3://", "")
    bucket, key = path.split('/', 1)
    s3_client.copy_object(Bucket=bucket, CopySource=path, Key=".csv")
    s3_client.delete_object(Bucket=bucket, Key=key)

read_s3("s3://"+ response + ".csv")

Error:
 File "athena_connect.py", line 67, in <module>
    read_s3("s3://"+ response + ".csv")
  File "athena_connect.py", line 64, in read_s3
    s3_client.copy_object(Bucket=bucket, CopySource=path, Key=".csv")
botocore.errorfactory.NoSuchKey: An error occurred (NoSuchKey) when calling the CopyObject operation: The specified key does not exist.

Но, когда response = 'somekey', этот код работает нормально.Что может быть не так?

Ответы [ 2 ]

0 голосов
/ 03 мая 2019
success = False
    while not success and exec_id:
        result = get_exec_status(exec_id, config)
        if result == 'SUCCEEDED':
            success = True
            print(result)
            break

добавить это будет работать нормально

0 голосов
/ 03 марта 2019

Ошибка:

Указанный ключ не существует

Это означает, что программа пытается прочитать несуществующий объект в Amazon S3.

Эта строка:

read_s3("s3://"+ response + ".csv")

ожидает, что response будет строкой, содержащей ключ к файлу.

Однако response ранее использовался в качестве словаря:

print('Execution ID: ' + response['QueryExecutionId'])

Поэтому может быть лучше использовать:

read_s3("s3://"+ response['QueryExecutionId'] + ".csv")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...