Ошибка отчетливого выброса (llegalStateException: keyCoder для GroupByKey должен быть детерминированным) - PullRequest
0 голосов
/ 20 марта 2019

При чтении данных из таблицы bigQuery с помощью Dataflow Job старается избегать дублирования в коллекции. Для этого используется beam.sdk.transforms.Distinct для чтения записи с отчетливым. Но получил ошибку ниже

java.lang.IllegalStateException: the keyCoder of a GroupByKey must be deterministic
    at org.apache.beam.sdk.transforms.GroupByKey.expand(GroupByKey.java:193)
    at org.apache.beam.sdk.transforms.GroupByKey.expand(GroupByKey.java:107)
    at org.apache.beam.sdk.Pipeline.applyInternal(Pipeline.java:537)
    at org.apache.beam.sdk.Pipeline.applyTransform(Pipeline.java:471)
    at org.apache.beam.sdk.values.PCollection.apply(PCollection.java:357)

Фрагмент кода:

PCollection<TableRow> mainData = p.apply("ReadCustomers",BigQueryIO.readTableRows().from(options.getCustomers()));
PCollection<TableRow> uniqueCollection = mainData.apply(Distinct.<TableRow>create());

Может ли кто-нибудь помочь мне решить эту проблему.

1 Ответ

1 голос
/ 21 марта 2019

TableRow не является типом данных, который наверняка будет детерминированным.Например, если вы хотите сериализовать в JSON, один и тот же элемент типа TableRow может выглядеть следующим образом:

{"name":"rajan", "language":"java"} vs {"language":"java", "name":"rajan"}

Это два разных недетерминированные способы сериализации одного и того же объекта, и, таким образом, если вы используете этот тип данных в качестве ключа, он не будет действительным.

Вместо этого вы можете использовать преобразованиеВаш объект в пары ключ-значение, которые имеют детерминированный ключ.Например:

PCollection<TableRow> uniqueCollection = p.apply("ReadCustomers",BigQueryIO.readTableRows()
                              .from(options.getCustomers()));
 .apply(WithKeys.of(new SerializableFunction<TableRow, Integer>() {
         public Integer apply(TableRow row) { return row.getUniqueId(); } })))
 .apply(Values<TableRow>.create());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...