Apache Beam, BigQueryIO, параметры записи() vs запись()

# #java #google-bigquery #gson #google-cloud-dataflow #apache-beam

Вопрос:

как выбрать эти 2 функции записи при использовании BigQueryIO.

Я нашел здесь официальный документ, в котором упоминается writeTableRows() , что не рекомендуется, но не понимаю, почему.

  1. Я могу использовать gson для сериализации моего Java POJO TableRow и writeTableRows() прямой записи с помощью
  2. Мне нужно вручную установить TableRow объект, если я использую write()

Вопросы:

  1. В чем причина предпочесть write() и
  2. имеют ли эти 2 варианта большую разницу в производительности?

Спасибо

Ответ №1:

TL;DR

Эти два варианта эквивалентны и имеют одинаковую базовую реализацию. Не беспокойтесь слишком сильно о рекомендации.

Мой совет:

  • Попробуйте отформатировать свои данные с write помощью функции форматирования.
  • Если вы не можете этого сделать, то не волнуйтесь слишком сильно и используйте writeTableRows

Подробное объяснение

Разница в том, что write выполняется функция форматирования, а для writeTableRows функции форматирования это просто идентификатор.

Я считаю write , что это рекомендуется writeTableRows , потому TableRow что объекты сериализуются с помощью JSON. JSON-очень неэффективный формат сериализации.

write реализует преобразование в TableRow прямо перед отправкой данных в BigQuery и writeTableRows преобразует данные, а затем передает их в несколько преобразований перед записью в BigQuery — это означает, что затраты на сериализацию могут быть выше writeTableRows .

Имеет ли это смысл? Спасибо!

Объяснение со слишком большим количеством деталей

В этом запросе на извлечение было добавлено слово «рекомендуемое» в Javadoc. Я спросил, почему — мы должны надеяться получить ответ на это : )

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

1. Они ответили: «writeTableRows часто дороже, потому что он зависит от объектов json». как вы предложили в своем ответе.

2. имеет смысл. Если ваши строки очень широкие (много столбцов), то неэффективность JSON хуже, но если ваши строки не огромны, то это может быть в основном нормально — тем не менее, лучше использовать функцию форматирования

3. если ответ подходит, вы можете выбрать его в качестве ответа на свой вопрос : )