将proto字节分解为可读格式



My Spark应用程序从Kafka接收二进制数据。数据以字节原型消息的形式发送给Kafka。原型消息是:

message Any {
string type_url=1;
bytes value=2;
}

使用ScalaPB库,我可以将Any消息反序列化为其原始格式。如何将值从字节反序列化为可读格式?SerializationUtils不起作用。这就是Any消息在反序列化后的外观。

#+-----------------------------------------|
#| type_url           | value              |
#+-----------------------------------------|
#|type.googleapis.c...|[0A 8D D8 04 0A 1...|
#+-----------------------------------------|

该值仍为字节格式。使用SerializationUtils对其进行反序列化后,数据不正确。

#+-----------------+
#|value            |
#+-----------------+
#|2020-09-04T10:...|
#+-----------------+

还有其他选择吗?有没有办法将字节反序列化为String、Struct或StringJson?

我使用带有udf的ScalaPBs示例将字节反序列化为Any消息。

val parseCloud = ProtoSQL.udf { bytes: Array[Byte] => CloudEvent.parseFrom(bytes) }

字节值的带有SerializationUtils的udf如下所示。

val parseBytes = ProtoSQL.udf {bytes: Array[Byte] => deserialize(bytes)}

如果知道Any中的消息类型,则可以使用unpack方法进行反序列化。

val unpackAny = ProtoSQL.udf { any: com.google.protobuf.any.Any => any.unpack[MyMessage] }

相关内容

  • 没有找到相关文章

最新更新