Google cloud dataflow 谷歌云数据流:Can';t使用TextIO.Read解析proto

Google cloud dataflow 谷歌云数据流:Can';t使用TextIO.Read解析proto,google-cloud-dataflow,Google Cloud Dataflow,这是我的密码 PCollection<MyProto> pCollection = p.apply(TextIO.Read.from( "gs://my_bucket/*") .withCoder(Proto2Coder.of(MyProto.class))); 本地下载的文件解析良好 我也尝试过使用StringUtf8Coder和ByteArrayCoder做同样的事情,但没有骰子 有什么帮助吗?我应该不使用TextIO吗?我还有什

这是我的密码

PCollection<MyProto> pCollection = p.apply(TextIO.Read.from(
            "gs://my_bucket/*")
            .withCoder(Proto2Coder.of(MyProto.class)));
本地下载的文件解析良好

我也尝试过使用StringUtf8Coder和ByteArrayCoder做同样的事情,但没有骰子


有什么帮助吗?我应该不使用TextIO吗?我还有什么其他选项?

TextIO将文件拆分为几行,并将编码器应用于每一行。当然,对于非基于行的格式来说,这并不适用。我想你的文件每个都包含一个序列化的proto,对吗?在这种情况下,您有两种选择:

  • 通过子类化创建自己的源类和读取器类(请参见)
  • 将处理所有文件的行为视为ParDo—创建一个内存中的PCollection,其中包含要处理的文件名(使用
    create.of()
    ),并将其通过一个ParDo,该ParDo接受一个文件名并将该文件解析为protobuf;然后将管道连接到管道的其余部分

第二种方法比较简单,但是如果你有很多文件,第一种方法会更好用。

有没有理由没有通用的
FileIO.Read
source?我们有protobufs。例如,它也可以是JSON,有太多不同的文件格式,假设的FileIO不可能显式支持所有这些格式。我觉得我不明白你的问题。也许您的意思是FileIO.Read只是将每个文件的全部内容解析为一个单字节数组(可以是任何格式),然后将用户提供的解析器应用于这个字节数组?(例如,将字节数组转换为protobuf或JSON等)这是有意义的,但我不确定你的意思是什么?是的,这正是我的意思。基于Google云存储文件的源,其中原子单位是文件(作为字节数组)。谢谢
Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).