2015-01-05 3 views
0

Я пытаюсь использовать разные кодеры для того же класса для двух различных сценариев:разные кодеры для того же класса в работе потока данных

  1. Чтение из входных файлов в формате JSON - с помощью data = TextIO.Read.from(options.getInput()).withCoder(new Coder1())
  2. В другом месте в работе Я хочу, чтобы класс быть сохранен с использованием SerializableCoder использованием data.setCoder(SerializableCoder.of(MyClass.class)

Она работает локально, но терпит неудачу при запуске в облаке с

Caused by: java.io.StreamCorruptedException: invalid stream header: 7B227365. 

Это поддерживаемый сценарий? Причина этого в первую очередь заключается в том, чтобы избежать чтения/записи формата JSON, а с другой стороны сделать чтение из входных файлов более эффективным (синтаксический анализ UTF-8 является частью JSON-считывателя, поэтому он может напрямую считывать из InputStream)

Пояснения: Coder1 - мой кодер.

Другой кодировщик является SerializableCoder.of(MyClass.class)

Как система выбрать кодер использовать? Эти два формата двоичные несовместимы, и, похоже, из-за некоторой оптимизации, второй кодер используется для формата данных, который может быть прочитан только первым кодером.

ответ

1

Да, используя два разных кодировщика, как это должно работать. (С предупреждением о том, что кодер в # 2 будет использоваться только в том случае, если система хочет сохранить «данные» вместо того, чтобы оптимизировать его в вычислениях объемного звучания.)

Используете ли вы свои собственные кодеры или те, которые предоставляются пакетом Dataflow SDK? Быстрое предостережение в TextIO - поскольку оно использует символы новой строки для кодирования границ элементов, вы столкнетесь с проблемой, если используете кодер, который генерирует закодированные значения, содержащие что-то, что может быть принято за новую строку. Вы действительно должны использовать только текстовые кодировки в TextIO. Мы надеемся сделать это более ясным в будущем.

Смежные вопросы