2015-06-04 5 views
1

Вот мой кодGoogle Cloud Dataflow: Невозможно разобрать прото с помощью TextIO.Read

PCollection<MyProto> pCollection = p.apply(TextIO.Read.from(
      "gs://my_bucket/*") 
      .withCoder(Proto2Coder.of(MyProto.class))); 

, но это не удается с ошибкой

Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero). 

файл при загрузке локально разбирает хорошо.

Я также попытался сделать то же самое, используя StringUtf8Coder и ByteArrayCoder, но не кубики.

любая помощь? Должен ли я использовать TextIO? Какие у меня есть другие варианты?

ответ

3

TextIO разбивает файл на строки и применяет кодер к каждой строке. Естественно, это плохо работает с форматами, которые не основаны на линиях. Я полагаю, что ваши файлы содержат один серийный протокол каждый, правильно? В этом случае у вас есть 2 варианта:

  • создать свой собственный источник и читателей классов (см generic documentation on creating sources and sinks) на подклассы FileBasedFormat.
  • Рассматривайте действие обработки всех ваших файлов в виде ParDo - создайте в памяти PCollection, содержащий имена файлов для обработки (используя Create.of()) и пропустите его через ParDo, который принимает имя файла и анализирует файл как protobuf; затем труба к остальной части вашего трубопровода.

Второй вариант проще, но первый будет работать лучше, если у вас действительно много файлов.

+0

Есть ли причина, по которой нет генератора 'FileIO.Read' источника? – Will

+0

Каким будет формат файлов, которые он читает? – jkff

+0

У нас протобуфы. Например, это может быть JSON. – Will

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