Запуск скрипта Python, получающего идентификатор выполнения в месте вывода

#python #amazon-web-services #amazon-cloudfront

#python #amazon-web-services #amazon-cloudfront

Вопрос:

Я запускаю скрипт python, но получаю идентификатор выполнения в виде файла .txt в месте вывода. Есть ли способ, с помощью которого я могу прокомментировать это и прекратить получать эти идентификаторы в качестве выходных данных. Ниже приведен скрипт Python:

   #!/usr/bin/env python3
import boto3
import datetime


# Function for executing athena queries

def run_ddl_query(ddl_query, database, s3_ddl_output):
    client = boto3.client('athena')
    response = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={
            'Database': 's3_accesslog'
            },
        ResultConfiguration={
            'OutputLocation': s3_ddl_output,
            }
        )
    print('Execution ID: '   response['QueryExecutionId'])
    return response
    
def run_query(query, database, s3_output):
    client = boto3.client('athena')
    
    # Setup and perform query
    response = client.start_query_execution(
            QueryString=query,
            QueryExecutionContext={
                 'Database': database
            },
            ResultConfiguration={
                 'OutputLocation': s3_output,
            }
        )

# Athena configuration
s3_ouput = 's3://xxxxx/athenatest/'
database = 's3_accesslog'
table = 'test_output'

# import datetime
year = datetime.date.today()
year = year.strftime('%Y')
month = datetime.date.today()
month = month.strftime('%m')
day = datetime.date.today()
day = day.strftime('%d')

# select bucket

s3_input = 's3://xxxxx/cf-ant-prod/cf-mon-prod/year=%s/month=%s/day=%s' % (year, month, day)

#Athena database and table definition
create_database = "CREATE DATABASE IF NOT EXISTS %s;" % (database)
create_table = 
  """CREATE EXTERNAL TABLE IF NOT EXISTS %s.%s (
  `Date` DATE,
   Time STRING,
   Location STRING,
   SCBytes BIGINT,
   RequestIP STRING,
   Method STRING,
   Host STRING,
   Uri STRING,
   Status INT,
   Referrer STRING,
   UserAgent STRING,
   UriQS STRING,
   Cookie STRING,
   ResultType STRING,
   RequestId STRING,
   HostHeader STRING,
   Protocol STRING,
   CSBytes BIGINT,
   TimeTaken FLOAT,
   XForwardFor STRING,
   SSLProtocol STRING,
   SSLCipher STRING,
   ResponseResultType STRING,
   CSProtocolVersion STRING,
   FleStatus STRING,
   FleEncryptedFields INT,
   CPort INT,
   TimeToFirstByte FLOAT,
   XEdgeDetailedResult STRING,
   ScContent STRING,
   ScContentLen BIGINT,
   ScRangeStart BIGINT,
   ScRangeEnd BIGINT
   )
   ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
   LOCATION '%s'
   TBLPROPERTIES ('skip.header.line.count' = '2');""" % ( database, table, s3_input )

#Query definitions
query_1 = "SELECT * FROM %s.%s where CAST(status AS VARCHAR) like '404';" % (database, table)

#Execute all queries
queries = [ create_database, create_table, query_1, ]
for q in queries:
   print("Executing query: %s" % (q))
   res = run_query(q, database, s3_ouput)
  

Я попытался прокомментировать печать (‘Идентификатор выполнения: ‘ ответ [‘QueryExecutionId’]), при повторной попытке выполнения скрипта он не отображается, но я вижу файлы .txt в пути вывода.

 $ ./Athena_Script_new.py
Executing query: CREATE DATABASE IF NOT EXISTS xxxxxx;
Execution ID: 21c2e158-b774-473c-812a-7ff121a688a2
Executing query: drop table xxxxxx.xxxxxxx;
Execution ID: cd39087a-f18f-4d93-aa71-26c5402cdc7d
Executing query: CREATE EXTERNAL TABLE IF NOT EXISTS xxxxxx.xxxxx (
  `Date` DATE,
   Time STRING,
   Location STRING,
   SCBytes BIGINT,
   RequestIP STRING,
   Method STRING,
   Host STRING,
   Uri STRING,
   Status INT,
   Referrer STRING,
   UserAgent STRING,
   UriQS STRING,
   Cookie STRING,
   ResultType STRING,
   RequestId STRING,
   HostHeader STRING,
   Protocol STRING,
   CSBytes BIGINT,
   TimeTaken FLOAT,
   XForwardFor STRING,
   SSLProtocol STRING,
   SSLCipher STRING,
   ResponseResultType STRING,
   CSProtocolVersion STRING,
   FleStatus STRING,
   FleEncryptedFields INT,
   CPort INT,
   TimeToFirstByte FLOAT,
   XEdgeDetailedResult STRING,
   ScContent STRING,
   ScContentLen BIGINT,
   ScRangeStart BIGINT,
   ScRangeEnd BIGINT
   )
   ROW FORMAT DELIMITED FIELDS TERMINATED BY '  '
   LOCATION 's3://xxxxxx/xxxxxxx/year=2020/month=09/day=03'
   TBLPROPERTIES ('skip.header.line.count' = '2');
Execution ID: d3ed413b-43ed-445e-92bd-e5ef794d2948
Executing query: SELECT * FROM xxxxxx.xxxxxxx where CAST(status AS VARCHAR) like '404';
Execution ID: be2378bd-c10e-4714-9611-978200cc8866
  

введите описание изображения здесь

Ответ №1:

Код, ответственный за ввод ваших результатов, является

 ResultConfiguration={
  'OutputLocation': s3_output,
}
  

Похоже, что файлы, из которых состоит ответ, жестко запрограммированы AWS и не могут быть изменены, см. AWS Athena, Работа с результатами запроса, выходными файлами и историей запросов.

Вы можете добавить удаление этого файла .txt вручную, как только он появится, но мне интересно, зачем вам нужно удалять this .txt и сохранять другие части результата. Я думаю, что обычно предполагалось сохранить или использовать и удалить весь ответ (все объекты в местоположении вывода).

Комментарии:

1. Я ищу только выходные данные из запроса select, но в нем много файлов .txt. Я планирую выполнять этот запрос ежедневно, чтобы я мог видеть больше этих текстовых файлов, которые бесполезны.

Ответ №2:

Файлы .txt создаются с помощью инструкций DDL, которые вы выполняете в своем скрипте. Я вижу несколько инструкций DDL, которые создают эти текстовые файлы. Для каждого DDL будет сгенерирован файл .txt в сконфигурированном OutputLocation . Обратитесь к определению выходных файлов запроса, чтобы узнать больше об этом.

Вы не можете запретить их генерирование, но вы можете просто позволить им генерироваться в каком-либо другом месте или очистить их, отыскав файлы .txt в OutputLocation .

Я считаю, что изменение местоположения для этих файлов, которые будут сгенерированы, является простым вариантом. Все, что вам нужно сделать, это создать еще одну функцию, как показано ниже. Поэтому, когда вы хотите запустить запрос DDL, используйте вместо этого эту функцию.

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

Таким образом, это создаст файлы .txt в другом местоположении / папке в том же ведре, которые вы можете просто удалить, используя что-то вроде S3.Client.delete_object

Комментарии:

1. Спасибо за ответ, Прабхакар, как уже было сказано, я обновил скрипт, теперь получаю следующую ошибку: Выполнение запроса: СОЗДАТЬ БАЗУ ДАННЫХ, ЕСЛИ НЕ СУЩЕСТВУЕТ s3_accesslog; Трассировка (последний последний вызов): Файл «./Athena_Script.py «, строка 88, в <module> res = run_query(q, database, s3_ouput) Ошибка имени: имя ‘run_query’ не определено

2. вам нужно создать две функции. Один для DDL, а другой для запросов select. Функция, которую я предоставил, является дополнительной к тому, что есть в вашем скрипте.

3. Не могли бы вы подтвердить приведенный выше сценарий, если вы хотите, чтобы я его выполнил и попробовал?

4. добавьте эту функцию в существующий скрипт и используйте эту функцию только для запросов DDL с другим местоположением

5. удалось ли выполнить запрос, создав две функции?