Как я могу кодировать обнуляемые объекты в облачном потоке данных Google?

Этот пост предназначен для ответа на следующие вопросы:

  • Какой встроенный CoderПоддерживает ли обнуляемые значения?
  • Как я могу кодировать обнуляемые объекты?
  • А как насчет классов с пустыми полями?
  • Как насчет коллекций с null записи?

1 ответ

Решение

Вы можете проверить встроенные кодеры в источнике DataflowJavaSDK.

Некоторые из кодеров по умолчанию не поддерживают null ценности, часто для эффективности. Например, DoubleCoder всегда кодирует double используя 8 байтов; добавив немного, чтобы отразить, является ли double является null добавит (дополненный) 9-й байт ко всем null ценности.

Можно кодировать обнуляемые значения, используя методы, описанные ниже.

  1. Мы обычно рекомендуем использовать AvroCoder кодировать классы. AvroCoder имеет поддержку обнуляемых полей, аннотированных org.apache.avro.reflect.Nullable аннотация:

    @DefaultCoder(AvroCoder.class)
    class MyClass {
      @Nullable String nullableField;
    }
    

    Посмотрите TrafficMaxLaneFlow для более полного примера кода.

    AvroCoder также поддерживает поля, которые включают Null в Union,

  2. Мы рекомендуем использовать NullableCoder кодировать обнуляемые объекты сами. Это реализует стратегию в #1.

    Например, рассмотрим следующий рабочий код:

    PCollection<String> output =
        p.apply(Create.of(null, "test1", null, "test2", null)
            .withCoder(NullableCoder.of(String.class)));
    
  3. Вложенные null поля / объекты поддерживаются многими кодировщиками, пока вложенный кодер поддерживает null поля / объекты.

    Например, SDK должен иметь возможность выводить работающий кодер, используя значение по умолчанию CoderRegistry для List<MyClass> - он должен автоматически использовать ListCoder с вложенным AvroCoder,

    Точно так же, List<String> с возможно- null Записи могут быть закодированы с помощью кодера:

    Coder<List<String>> coder = ListCoder.of(NullableCoder.of(String.class))
    

Наконец, в некоторых случаях кодеры должны быть детерминированными, например, ключ, используемый для GroupByKey, В AvroCoder, @Nullable поля кодируются детерминистически до тех пор, пока Coder для базового типа сам по себе является детерминированным. Точно так же, используя NullableCoder не должно влиять на то, может ли объект быть закодирован детерминистически.

Другие вопросы по тегам