Преобразование Deduplicate
работает, помещая весь элемент в ключ, а затем выполняет операцию группирования ключей (в данном случае ParDo с отслеживанием состояния). Поскольку Beam не зависит от языка, группировка по ключу выполняется с использованием закодированной формы элементов. Два элемента, которые кодируют одни и те же байты, «равны», а два элемента, которые кодируют разные байты, являются «неравными». язык (например, Java) относится к равенству лучей. Это означает, что если два объекта Java равны согласно Java equals()
, то они должны иметь одинаковые закодированные байты. Для простых данных, таких как строки, числа, массивы, это легко. Полезно подумать о том, что делает кодер не -детерминированным c. Например, при кодировании двух экземпляров Map
они могут быть equals()
на уровне Java, но пары ключ-значение кодируются в другом порядке, что делает их неравными для Beam.
Если у вас есть недетерминированный c кодер для MyModel
, тогда Deduplicate
не будет работать правильно, и вы получите дубликаты, потому что Beam считает, что объекты с разным кодированием не равны.
Вероятно, самый простой способ автоматически получить высококачественный детерминированный c кодер должен использовать вывод схемы Beam: https://beam.apache.org/documentation/programming-guide/#schemas -for-pl-types . Вам нужно будет убедиться, что все поля также могут быть закодированы детерминированно.