Apache spark Spark结构化流媒体中Kafka协议的反序列化
我正在测试一个工作中的实现,每天将有3亿条消息通过,并计划大幅扩展。现在有一个步骤看起来很僵硬,我希望能得到一些建议 我确实尝试过这一点,但似乎无法让它工作,甚至按照他们的专业指导 目前,我有一个protobuf和一个case类用于相同的模型:Apache spark Spark结构化流媒体中Kafka协议的反序列化,apache-spark,apache-kafka,protocol-buffers,spark-structured-streaming,Apache Spark,Apache Kafka,Protocol Buffers,Spark Structured Streaming,我正在测试一个工作中的实现,每天将有3亿条消息通过,并计划大幅扩展。现在有一个步骤看起来很僵硬,我希望能得到一些建议 我确实尝试过这一点,但似乎无法让它工作,甚至按照他们的专业指导 目前,我有一个protobuf和一个case类用于相同的模型: message MyThing { // proto required string id = 1; } case class MyThing(id: String) 然后我有了一个spark readStream val df =
message MyThing { // proto
required string id = 1;
}
case class MyThing(id: String)
然后我有了一个spark readStream
val df =
spark.readStream
.format("kafka")
// etc
.load()
卡夫卡有效载荷位于“value”列中,该列是来自所传输协议的数组[Byte]。我想将该二进制列转换为具有特定结构类型的行
我现在使用的是一种涉及case类的奇怪语法:
val encoder = Encoder.product[MyThing]
df
.select("value")
.map { row =>
// from memory so might be slightly off
val proto = MyThingProto.parseFrom(row.getBinary(0))
val myThing = MyThing.fromProto(proto)
myThing
}(encoder)
.toDF()
// business logic
.writeStream
...//output
我能让这更高效/更快吗?创建case类所涉及的开销似乎过大。我更愿意做这样的事情:
.map { row =>
// from memory so might be slightly off
val proto = MyThingProto.parseFrom(row.getBinary(0))
val row = buildRow(proto)
row
}(encoder??) // what kind of encoder is used here?
def buildRow(proto: MyThingProto): Row =
Row(proto.getId)
这样会更好吗?或者使用Kafka反序列化器接口的UDF
提前谢谢。您找到更干净的解决方案了吗?对case类的需求似乎非常棘手,但是scalapb要求我用java和scala生成protobuf类,我宁愿避免这种情况。你找到更干净的解决方案了吗?对case类的需求似乎非常棘手,但是scalapb要求我用java和scala生成protobuf类,我宁愿避免这样做。