scala - Spark将原始字节解组为可读格式
问题描述
我的 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:...|
#+-----------------+
还有其他选择吗?有没有办法将字节反序列化为字符串、结构或字符串 Json?
我使用带有 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] }
推荐阅读
- django - 配置树莓派,以便 2D 扫描仪与树莓派一起使用
- angular - 当我尝试访问反应形式的元素进行单元测试时,我收到此错误“TypeError:this.reCaptchaApi.render is not a function”
- python - 遍历图像对象列表以保存文件
- python - 鼠标拖动并使用 pynput 切换
- javascript - 如何改变 。再次变成“।” 那是印地语句号字符(Purnviram)
- python - 使用 Apache Web 服务器托管它时出现 Django 错误
- javascript - 如何使用 Python 在 Excel 的行尾动态添加总计?
- visual-studio-code - typedef 用于字符串别名?
- arguments - 无法使用参数调用 strategy.entry
- java - Android java - 是否可以自动打开文件?