Как избежать мутации «УЖЕ СУЩЕСТВУЕТ» при записи мутации в таблицу ключей? - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть определенный вариант использования, где я пытаюсь записать данные о туберкулезе в Spanner. Мы извлекаем эти данные из DynamoDb и экспортируем эти данные в формате bzip2 в Google Cloud Storage. Таким образом, в основном у нас есть первичные идентификаторы в Spanner, и мы должны игнорировать уже существующие строки в Spanner. Поэтому я написал код ниже для достижения того же.

    Mutation.WriteBuilder mutation = Mutation.newInsertBuilder(spannerTable.get());

Я написал конструктор вставок, так как не хочу обновлять существующую строку в Spanner. Используя приведенный ниже код для записи строки в Spanner, установите FailureMode.

results2.apply("Write Mutations to Spanner",SpannerIO.write()
                .withInstanceId(spannerInstanceId)
                .withDatabaseId(spannerDatabaseId)
                //.withBatchSizeBytes(2000000)
                //.withMaxNumMutations(maxNumMutations)
                .withFailureMode(FailureMode.REPORT_FAILURES)
                ); 

Но проблема с кодом заключается в том, что код потока данных повторяет весь пакет из-за мутации "ALREADY EXISTS". Я не могу использовать FailureMode.FAST_FAIL, потому что он останавливает весь конвейер. Я также попытался установить минимальное значение MaxNumMutation для уменьшения размера batch_size (в основном, для уменьшения вероятности записи «уже_экспертиза» в пакете мутаций), но общая производительность мешает. Так есть ли способ, которым я могу остановить механизм повтора для «уже существующей» записи мутации?

1 Ответ

1 голос
/ 07 февраля 2020

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

Пример:

    Mutation mutation = Mutation.newInsertOrUpdateBuilder("FOO")
        .set("ID")
        .to(1)
        .set("BAR")
        .to("BAZ")
        .build();

Вы также можете увидеть предыдущее в официальная документация гаечного ключа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...