Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark结构化流媒体中Kafka协议的反序列化_Apache Spark_Apache Kafka_Protocol Buffers_Spark Structured Streaming - Fatal编程技术网

Apache spark Spark结构化流媒体中Kafka协议的反序列化

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 =

我正在测试一个工作中的实现,每天将有3亿条消息通过,并计划大幅扩展。现在有一个步骤看起来很僵硬,我希望能得到一些建议

我确实尝试过这一点,但似乎无法让它工作,甚至按照他们的专业指导

目前,我有一个protobuf和一个case类用于相同的模型:

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类,我宁愿避免这样做。