Я пытаюсь создать Cloud Dataflow 2.x (он же Apache Beam) PTransform
, чтобы отфильтровать элементы PCollection
, которые уже были "видны" ранее.
Основная идея заключается в том, что PTransform получает функцию для вычисления естественного идентификатора («первичный ключ») для каждого из элементов PCollection. Каждый из этих идентификаторов будет использоваться для создания ключа хранилища данных в облаке и хранится в фиктивном виде сущности («таблица»); если вставка завершается неудачно из-за ошибки дублирования ключа, я знаю, что уже видел соответствующий естественный идентификатор и, следовательно, тот же элемент PCollection.
Я предполагаю, что лучший способ реализовать это - использовать Bundles в DoFn и отправлять пакетные запросы в Datastore с помощью моего метода @FinishBundle.
Я понимаю, что в этом случае я не могу использовать фиксации транзакций, потому что если только одна мутация вставки завершится неудачно из-за того, что ее ключ уже существует, это приведет к сбою всей транзакции, а в документации сказано, что невозможно понять, какой из ключей является уже существующий.
Если я использую нетранзакционные вставки, гарантирую ли я, что при одновременной вставке одного и того же ключа произойдет сбой хотя бы одного из них?
В противном случае, какие еще варианты у меня есть? Я бы предпочел не использовать транзакции только с одной мутацией, а объединять несколько мутаций вместе.
Я использую API datastore-v1-proto-client
/ datastore-v1-protos
(он же API REST Datastore v1), а не новый google-cloud-datastore
API.