# #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 Я вижу только следующие решения этой проблемы:
- Создайте таблицу схему заранее вместо использования автоматического извлечения
- Используйте адаптеры при загрузке в BigQuery и/или экспорте из него
- Измените схему 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, но опять же есть способ упростить реализацию адаптера, а не решение, позволяющее избежать их использования.