proto3, com.google.protobuf.CodedInputStream.readStringRequireUtf8()Ljava/lang/String;

Thi*_*ark 3 java protocol-buffers

我正在使用我最新项目中的协议缓冲区(proto3)。但我遇到以下问题。从 python 生成的编码消息,我正在尝试从 Scala 解码它(我正在使用 SPARK)。您可以看到来自“value”的实际消息及其长度 227,如控制台中所述。

错误字段只是典型的字符串类型字段。我也尝试将字符串字段解码为“UTF-8”,但它不起作用。看起来编码/解码问题。有没有其他人遇到过类似的问题?

控制台输出

...

value: 
U
$a5a9c2bb-efd2-4ea3-ae0e-7479925a7807"kafka_producer.py*2016-12-18 10:37:25.075614*
data{"url": "some url 0", "title": "some title", "_id": "5815a37c43cfd44120e50538", "content": "some content", "tags": ["football"]}
value length: 227
Exception in thread "streaming-job-executor-0" java.lang.NoSuchMethodError: com.google.protobuf.CodedInputStream.readStringRequireUtf8()Ljava/lang/String;
at org.libero.messages.Messages$Event.<init>(Messages.java:160)
at org.libero.messages.Messages$Event.<init>(Messages.java:117)
at org.libero.messages.Messages$Event$1.parsePartialFrom(Messages.java:1564)
at org.libero.messages.Messages$Event$1.parsePartialFrom(Messages.java:1559)
at com.google.protobuf.CodedInputStream.readMessage(CodedInputStream.java:309)
at org.libero.messages.Messages$EventDataProduced.<init>(Messages.java:1742)
at org.libero.messages.Messages$EventDataProduced.<init>(Messages.java:1697)
at org.libero.messages.Messages$EventDataProduced$1.parsePartialFrom(Me

...
Run Code Online (Sandbox Code Playgroud)

代码片段

 ....

 nonEmptyMsgs.foreachRDD { msgsRDD =>
      println("Trying to print each RDD: " + msgsRDD)
      println("Count: " + msgsRDD.count())
      val elems = msgsRDD.collect()
      println("Elems: " + elems)
      for (v <- elems) {
        println("key: " + v._1)
        println("value: " + v._2)
        println("value length: " + v._2.length())
        val bytes = new String(v._2).getBytes()
        val event = EventDataProduced.parseFrom(ByteString.copyFrom(bytes))
        println("event: " + event)
      }
    }

...
Run Code Online (Sandbox Code Playgroud)

小智 6

如何在 Hadoop/Spark 中使用 proto3?

如上链接,我修复了它。

只需要重新定位 protobuffers,VerifyError 就会消失:

      <relocations>
        <relocation>
          <pattern>com.google.protobuf</pattern>
          <shadedPattern>shaded.com.google.protobuf</shadedPattern>
        </relocation>
      </relocations>
Run Code Online (Sandbox Code Playgroud)