Как я могу кодировать обнуляемые объекты в облачном потоке данных Google?
Этот пост предназначен для ответа на следующие вопросы:
- Какой встроенный
Coder
Поддерживает ли обнуляемые значения? - Как я могу кодировать обнуляемые объекты?
- А как насчет классов с пустыми полями?
- Как насчет коллекций с
null
записи?
1 ответ
Вы можете проверить встроенные кодеры в источнике DataflowJavaSDK.
Некоторые из кодеров по умолчанию не поддерживают null
ценности, часто для эффективности. Например, DoubleCoder
всегда кодирует double
используя 8 байтов; добавив немного, чтобы отразить, является ли double
является null
добавит (дополненный) 9-й байт ко всем null
ценности.
Можно кодировать обнуляемые значения, используя методы, описанные ниже.
Мы обычно рекомендуем использовать
AvroCoder
кодировать классы.AvroCoder
имеет поддержку обнуляемых полей, аннотированныхorg.apache.avro.reflect.Nullable
аннотация:@DefaultCoder(AvroCoder.class) class MyClass { @Nullable String nullableField; }
Посмотрите TrafficMaxLaneFlow для более полного примера кода.
AvroCoder
также поддерживает поля, которые включаютNull
вUnion
,Мы рекомендуем использовать
NullableCoder
кодировать обнуляемые объекты сами. Это реализует стратегию в #1.Например, рассмотрим следующий рабочий код:
PCollection<String> output = p.apply(Create.of(null, "test1", null, "test2", null) .withCoder(NullableCoder.of(String.class)));
Вложенные
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
не должно влиять на то, может ли объект быть закодирован детерминистически.