Выполнение запроса Athena из кода python с использованием boto3 показывает ошибку «botocore.errorfactory.Исключение InvalidRequestException»

#boto3 #amazon-athena

#boto3 #amazon-athena

Вопрос:

Я выполняю запрос Athena с использованием библиотеки boto3 в соответствии с приведенным ниже кодом:

 import boto3
client = boto3.client('athena')

def main():
    queryStart = client.start_query_execution(
        QueryString = 'SELECT * FROM <tablename>',
        QueryExecutionContext = {
            'Database': '<databasename>'
        },
        ResultConfiguration={
        'OutputLocation': 's3://<outputlocation>',
        'EncryptionConfiguration': {
            'EncryptionOption': 'SSE_S3'
        }
     }
    )
    queryExecution = client.get_query_results(QueryExecutionId=queryStart['QueryExecutionId'],MaxResults=10)
    prinnt(queryExecution)
  

При выполнении этого простого кода я получаю ошибку:

   Traceback (most recent call last):
      File "readingathena.py", line 38, in <module>
      main()
      File "readingathena.py", line 33, in main
      for i in response_iterator:
      File "C:Program FilesPython36libsite-packagesbotocorepaginate.py", line 255, in __iter__
      response = self._make_request(current_kwargs)
      File "C:Program FilesPython36libsite-packagesbotocorepaginate.py", line 332, in _make_request
return self._method(**current_kwargs)
      File "C:Program FilesPython36libsite-packagesbotocoreclient.py", line 357, in _api_call
      return self._make_api_call(operation_name, kwargs)
      File "C:Program FilesPython36libsite-packagesbotocoreclient.py", line 661, in _make_api_call
      raise error_class(parsed_response, operation_name)
      botocore.errorfactory.InvalidRequestException: An error occurred (InvalidRequestException) when calling the GetQueryResults operation: Query has not yet finished. Current state: RUNNING
  

Чего я хочу добиться, так это напечатать результат на консоли вместо того, чтобы хранить его в папке s3.

P.S выходные данные сохраняются в корзине S3, несмотря на ошибку. Но не удается получить ответ с помощью функции «get_query_results»

Ответ №1:

Невозможно получить результаты запроса, пока запрос не будет завершен, т. Е. состояние SUCCEEDED . Вы должны использовать get_query_execution вызов API для опроса состояния, пока оно не будет SUCCEEDED и только после этого вызывать get_query_results .

Также, к сожалению, нет способа получить результат без его сохранения на S3. Так устроена Athena, и обойти это невозможно.

Ответ №2:

У меня была эта проблема, я исправил ее, только добавив политику «AmazonS3FullAccess» к роли, которую использует Lambda.