Как указать insertId при вставке в BigQuery с использованием Apache Beam - PullRequest
0 голосов
/ 09 января 2019

BigQuery поддерживает дедупликацию для потоковой вставки. Как я могу использовать эту функцию, используя Apache Beam?

https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency

Чтобы обеспечить согласованность данных, вы можете указать insertId для каждой вставленной строки. BigQuery запоминает этот идентификатор не менее одной минуты. Если вы попытаетесь выполнить потоковую передачу одного и того же набора строк в течение этого периода времени, а свойство insertId будет установлено, BigQuery использует свойство insertId для максимально эффективного дублирования ваших данных. Возможно, вам придется повторить вставку, потому что нет способа определить состояние потоковой вставки при определенных условиях ошибки, таких как сетевые ошибки между вашей системой и BigQuery или внутренние ошибки в BigQuery. Если вы повторите попытку вставки, используйте один и тот же insertId для того же набора строк, чтобы BigQuery мог попытаться де-дублировать ваши данные. Для получения дополнительной информации см. Устранение неполадок потоковых вставок.

Я не могу найти такую ​​функцию в Java doc. https://beam.apache.org/releases/javadoc/2.9.0/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.Write.html

В этом вопросе он предлагает установить insertId в TableRow. Это правильно?

https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/model/TableRow.html?is-external=true

Клиентская библиотека BigQuery имеет эту функцию.

https://googleapis.github.io/google-cloud-java/google-cloud-clients/apidocs/index.html?com/google/cloud/bigquery/package-summary.html https://github.com/googleapis/google-cloud-java/blob/master/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/InsertAllRequest.java#L134

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Как упомянул Фелипе в комментарии, похоже, что Dataflow уже использует для себя insertId для реализации «ровно один раз». поэтому мы не можем вручную указать insertId.

0 голосов
/ 11 января 2019
  • Pub / Sub + Beam / Dataflow + BigQuery : «Ровно один раз» должен быть гарантирован, и вам не нужно сильно беспокоиться об этом. Эта гарантия сильнее, когда вы просите Dataflow вставить в BigQuery, используя FILE_LOADS вместо STREAMING_INSERTS , на данный момент.

  • Kafka + Beam / Dataflow + BigQuery : если сообщение может быть отправлено несколько раз из Kafka (например, если производитель повторил вставку), то вам необходимо позаботиться о дублирования. Либо в BigQuery (в соответствии с вашими комментариями), либо в потоке данных с преобразованием .apply(Distinct.create()).

...