(AWS) Афина: результаты запроса кажутся слишком короткими

Результаты моих запросов по Афине слишком короткие. Пытаюсь понять, почему?

Настраивать:

Каталоги клея (размером 118,6 Гб). Данные: хранятся в S3 как в формате CSV, так и в формате JSON. Athena Query: когда я запрашиваю данные для всей таблицы, я получаю только 40K результатов на запрос, для этого запроса должно быть 121 миллион записей в среднем для данных за один месяц.

Запрашивает ли Афина Кэп данные результата? Является ли это пределом обслуживания (в документации это не указано).


person Compiled Kernel    schedule 18.01.2018    source источник


Ответы (2)


Кажется, что существует ограничение в 1000. Вы должны использовать NextToken для перебора результатов.

Цитата из документации GetQueryResults

MaxResults Максимальное количество результатов (строк), возвращаемых в этом запросе.

Тип: целое число

Допустимый диапазон: минимальное значение 0. Максимальное значение 1000.

Обязательно: Нет

person MaiKaY    schedule 18.01.2018
comment
С точки зрения SDK это имеет смысл. Но в консоли ограничение на количество запросов превышает 1000. Таблица, содержащая 121 000 000 записей для select *, возвращает 40 000 записей. - person Compiled Kernel; 19.01.2018
comment
Хорошо. Не знал, что вы используете CLI SDK. Но если CLI возвращает 40000, подход тот же. Перебирайте результаты с помощью NextToken. - person MaiKaY; 19.01.2018

Таким образом, получение 1000 результатов за один раз явно не масштабируется. К счастью, есть простой обходной путь. (Или, может быть, так все и предполагалось.)

Когда вы запускаете запрос Athena, вы должны получить QueryExecutionId. Этот идентификатор соответствует выходному файлу, который вы найдете в S3.

Вот отрывок, который я написал:

s3 = boto3.resource("s3")
athena = boto3.client("athena")
response: Dict = athena.start_query_execution(QueryString=query, WorkGroup="<your_work_group>")
execution_id: str = response["QueryExecutionId"]
print(execution_id)

# Wait until the query is finished
while True:
    try:
        athena.get_query_results(QueryExecutionId=execution_id)
        break
    except botocore.exceptions.ClientError as e:
        time.sleep(5)

local_filename: str = "temp/athena_query_result_temp.csv"
s3.Bucket("athena-query-output").download_file(execution_id + ".csv", local_filename)
return pd.read_csv(local_filename)

Убедитесь, что соответствующая рабочая группа имеет установленное местоположение результата запроса, например s3: // Афина-запрос-вывод /

Также см. Эту ветку с похожими ответами: Как создать фрейм данных из AWS Athena с помощью метода Boto3 get_query_results

person Alexei Andreev    schedule 23.09.2020