У меня есть несколько таблиц, которые заполняются потоковым приложением GCP DataFlow как часть некоторых конвейеров данных (тот факт, что это DataFlow, здесь не так уж важен, за исключением того, что он заполняется на полурегулярной основе впотоковый режим).Эти таблицы используются нижестоящими процессами, которые зависят от имени таблицы.
Мне нужно разработать схему этих таблиц производственным способом.Следуя рекомендациям по документации BQ (https://cloud.google.com/bigquery/docs/manually-changing-schemas#option_2_exporting_your_data_and_loading_it_into_a_new_table),, я намереваюсь экспортировать текущую таблицу в формате AVRO в GCS, а затем создать новую таблицу * на основе новой обратно совместимой схемы и, наконец, загрузить экспорт AVRO в новую таблицу перед тем, какзатем перезаписываем исходную таблицу.
* Причина, по которой я создаю новую таблицу, а не пишу по той же самой таблице, заключается в том, что мне нужно убедиться, что эта операция выполнена успешно в нескольких проектах, с которыми я координирую эту эволюцию схемы, прежде чем«обновить» фактическую таблицу. В любом случае, я думаю, у меня возникла бы та же проблема, если бы я попытался обновить таблицу на месте.
Проблема
Проблема заключается в том, что междуПри запуске экспорта и завершении загрузки мое приложение DataFlow могло обновить исходную таблицу (она работает в режиме INSERT / OVERWRITE PARTITION). Это является проблемой, поскольку при обработке изменения схемы я потеряю эти данные.
Как мне безопасно обновить схему таблицы без пакетной передачи?sactions / распределенные транзакции / блокировки таблиц?Как упоминалось в приведенном выше блоке *, у меня есть дополнительная сложность, связанная с необходимостью использования прерывистой таблицы, чтобы гарантировать, что моя работа будет работать во всех проектах, прежде чем я обработаю ее в таблице, от которой зависят нисходящие компоненты.
Единственный вариант, который я могу придумать, - это пользовательская реализация поведения, которое я получу через блокировку, но через сотрудничество.Т.е. мой процесс обновления схемы может отправить сообщение в DataFlow, чтобы он отложил его до завершения своей работы.