Как работать с преобразованиями типа Avro в BigQuery при использовании заданий загрузки с автоматическим извлечением схемы

# #google-bigquery #avro

Вопрос:

Мы определили общую модель для всей компании в Avro и хотели бы загрузить данные этой модели в BigQuery с помощью LoadJobs автоматического поиска схемы, а затем экспортировать данные (в облачное хранилище Google или где-либо еще) и десериализовать/прочитать их с помощью той же модели Avro.

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

Мы видим следующие несовместимые преобразования типов:

Схема модели (используется при загрузке) Производный тип BigQuery Схема (после экспорта)
int INTEGER long
float FLOAT double
time-millis TIME time-micros
timestamp-millis TIMESTAMP timestamp-micros
map REPEATED RECORD array

Fmpov Я вижу только следующие решения этой проблемы:

  1. Создайте таблицу схему заранее вместо использования автоматического извлечения
  2. Используйте адаптеры при загрузке в BigQuery и/или экспорте из него
  3. Измените схему Avro, чтобы использовать типы, которые «совместимы» (которые не изменяются между загрузкой и экспортом) с помощью BigQuery

Есть еще какие-нибудь идеи?

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

1. Можете ли вы подтвердить, что этапы воспроизведения следующие: 1 — Загрузите схему avro 2 — Экспортируйте ее из BQ 3 — тогда типы данных разные?

2. @JaimeLopez да, шаги следующие: 1. Загрузка задания из файла контейнера avro 2. Экспорт задания из BQ. Выглядит это так: gist.github.com/leozilla/2fb36fa3ec98face4fff5d1161c50a3a

Ответ №1:

Когда вы экспортируете некоторые данные из BigQuery в формат Avro, он создаст схему без возможности определения пользовательской. Вы можете проверить тип целевого поля Avro в зависимости от схемы BigQuery здесь.

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

Использование адаптеров, по-видимому, является лучшим вариантом в вашем случае, и, возможно, прямой экспорт даты и времени из BigQuery в миллисекундах может облегчить вашу жизнь. Кроме того, в зависимости от того, что вы делаете с BigQuery, вы также можете подумать о том, чтобы не использовать логические типы Avro при импорте данных в BigQuery, но опять же есть способ упростить реализацию адаптера, а не решение, позволяющее избежать их использования.