Результаты запроса Афины: всегда ли они строки? - PullRequest
0 голосов
/ 19 февраля 2019

Я нахожусь в процессе строительства новых "ETL" трубопроводов с CTAS.К сожалению, довольно часто запрос CTAS слишком интенсивен, что приводит к тому, что Athena перестает работать.Поэтому я использую CTAS для создания начальной таблицы и заполнения небольшим образцом.Затем я пишу сценарий, который запрашивает ту же таблицу, из которой был сгенерирован CTAS (формат партера), в течение оставшихся дней, которые CTAS не мог обработать заранее.Я записываю выходные данные этих результатов запроса в тот же каталог, в котором содержатся результаты запроса CTAS, прежде чем восстанавливать таблицу (чтобы получить новые данные).Тем не менее, это кажется довольно неуклюжим процессом по ряду причин:

1) Результаты запросов, записанные с использованием стандартных операторов SQL, в итоге становятся строками.Например, когда я записываю количество DAU (которое является счетчиком и приводится к int), вывод csv представляет собой строку Ie, заключенную в «».Можно ли выписать Athena «query_results» (не CTAS) как что-либо кроме строки, когда в формате CSV.Основная проблема с этим состоит в том, что он не может быть считан обратно в таблицу, созданную CTAS, так как эти столбцы ожидают bigint.Это, конечно, можно решить с помощью лямбда-функции, но кажется, что это требует больших затрат для чего-то, что должно быть тривиальным.

2) Можете ли вы помещать результаты запроса (не из CTAS) непосредственно в паркет вместо CSV?

3) Есть ли способ предотвратить генерацию метаданных с помощью query_results (не из CTAS).Опять же, его можно очистить с помощью лямбда-функции, но это просто дополнительная ерунда, с которой мне нужно справиться.

Заранее спасибо!

1 Ответ

0 голосов
/ 20 февраля 2019

Тип данных результата зависит от SQL, использованного для его создания, а также от того, как вы его используете.Исходя из вашего вопроса, я собираюсь предположить, что вы создаете таблицу с использованием CTAS и что выводом является CSV, а затем вы смотрите непосредственно на данные CSV.

Этот CSV собираетсяв нем есть кавычки, но это не значит, что невозможно прочитать целочисленные значения как целые числа и так далее.Афина использует подход «схема при чтении», и пока serde может интерпретировать значение как определенный тип, этот тип будет работать как тип столбца.

Если вы запросите таблицу, созданную вашимВ операции CTAS вы должны получить целые числа для столбцов целых чисел.

Используя CTAS, вы также можете создавать выходные данные различных типов, таких как JSON, Avro, Parquet и ORC, которые хранят информацию о типе.Просто используйте свойство format для выбора типа вывода .

Я немного озадачен тем, что вы подразумеваете под своим третьим вопросом.При обычном запросе вы получите два файла на S3, файл данных и файл метаданных, и они будут записаны в выходное местоположение, указанное в вызове API StartQueryExecution, но с запросом CTAS вы получите выходные данные в другомместоположение (указано в SQL), чем файл метаданных.

Вы на самом деле используете CTAS или говорите о файлах результатов обычного запроса?


Обновление после уточнения вопроса:

1) Афина, к сожалению, не может правильно прочитать свой вывод во многих ситуациях.Это то, что действительно удивляет меня, что они никогда не рассматривали до запуска.Возможно, вам удастся настроить таблицу, которая использует регулярное выражение.

2) Нет, к сожалению, в настоящее время единственным выводом обычного запроса является CSV.

3) Нет,метаданные всегда записываются в тот же префикс, что и выходные данные.

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

...