Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Scala 将通用avro记录序列化为数组[Byte]可将模式保留在对象中_Scala_Apache Kafka_Avro_Bijection - Fatal编程技术网

Scala 将通用avro记录序列化为数组[Byte]可将模式保留在对象中

Scala 将通用avro记录序列化为数组[Byte]可将模式保留在对象中,scala,apache-kafka,avro,bijection,Scala,Apache Kafka,Avro,Bijection,形势 我目前正在使用AVRO和模式存储库编写一个消费者/生产者 从我收集的数据来看,我可以选择使用Confluent的avro序列化程序,或者使用Twitter的双射 看起来双射法是最直接的 所以我想用以下格式生成日期ProducerRecord[String,Array[Byte]],这归结为[some String ID,serialized genericord] (注意:我将使用通用记录,因为此代码库必须处理从Json/csv/解析的数千个模式) 问题: def jsonString

形势

我目前正在使用AVRO和模式存储库编写一个消费者/生产者

从我收集的数据来看,我可以选择使用Confluent的avro序列化程序,或者使用Twitter的双射

看起来双射法是最直接的

所以我想用以下格式生成日期
ProducerRecord[String,Array[Byte]]
,这归结为[some String ID,serialized genericord]

(注意:我将使用通用记录,因为此代码库必须处理从Json/csv/解析的数千个模式)

问题:

  def jsonStringToAvro(jString: String, schema: Schema): GenericRecord = {
    val converter = new JsonAvroConverter
    val genericRecord = converter.convertToGenericDataRecord(jString.replaceAll("\\\\/","_").getBytes(), schema)

    genericRecord
  }
def serializeAsByteArray(avroRecord: GenericRecord): Array[Byte] = {
    //val genericRecordInjection = GenericAvroCodecs.toBinary(avroRecord.getSchema)
    val r: Array[Byte] = GenericAvroCodecs.toBinary(avroRecord.getSchema).apply(avroRecord)

    r
  }

//schema comes from a rest call to the schema repository
new ProducerRecord[String, Array[Byte]](topic, myStringKeyGoesHere, serializeAsByteArray(jsonStringToAvro(jsonObjectAsStringGoesHere, schema)))


        producer.send(producerRecord, new Callback {...})
我序列化并使用AVRO的全部原因是,您不需要在数据本身中使用模式(就像使用Json/XML/…)。
但是,当检查主题中的数据时,我看到整个方案都包含在数据中。我是否在做一些根本错误的事情,这是出于设计,还是应该改用合流序列化程序

代码:

  def jsonStringToAvro(jString: String, schema: Schema): GenericRecord = {
    val converter = new JsonAvroConverter
    val genericRecord = converter.convertToGenericDataRecord(jString.replaceAll("\\\\/","_").getBytes(), schema)

    genericRecord
  }
def serializeAsByteArray(avroRecord: GenericRecord): Array[Byte] = {
    //val genericRecordInjection = GenericAvroCodecs.toBinary(avroRecord.getSchema)
    val r: Array[Byte] = GenericAvroCodecs.toBinary(avroRecord.getSchema).apply(avroRecord)

    r
  }

//schema comes from a rest call to the schema repository
new ProducerRecord[String, Array[Byte]](topic, myStringKeyGoesHere, serializeAsByteArray(jsonStringToAvro(jsonObjectAsStringGoesHere, schema)))


        producer.send(producerRecord, new Callback {...})
如果查看,您将看到与模式存储库交互的操作顺序如下

  • 从Avro记录中获取模式,并计算其ID。理想情况下,将模式发布到存储库,或者对其进行散列,应该会得到一个ID
  • 分配一个ByteBuffer
  • 将返回的ID写入缓冲区
  • 将Avro对象值(不包括架构)作为字节写入缓冲区
  • 将字节缓冲区发送到卡夫卡
  • 目前,双射用法将包括字节中的模式,而不是用ID替换它。如果查看,您将看到与模式存储库交互的操作顺序如下

  • 从Avro记录中获取模式,并计算其ID。理想情况下,将模式发布到存储库,或者对其进行散列,应该会得到一个ID
  • 分配一个ByteBuffer
  • 将返回的ID写入缓冲区
  • 将Avro对象值(不包括架构)作为字节写入缓冲区
  • 将字节缓冲区发送到卡夫卡

  • 目前,双射用法将包括字节中的模式,而不是用ID替换它

    双射库不会与模式注册表交互,也不会像合流序列化程序那样将ID放在任何地方。因此,整个架构将成为消息的一部分。
    ProducerRecord[String,genericord]
    有什么问题吗?然后把其余的调用放在序列化程序中?有些项目可能会有很大的卷,所以我认为序列化会给我带来一些性能提升。因此,当我使用Confluent序列化程序时,这将从通用记录中剥离模式?不过,Kafka序列化程序接口旨在为您获取字节数组。在类的“主方法”中编写该逻辑没有任何好处双射库不会与模式注册表交互,也不会像合流序列化程序那样将ID放在任何地方。因此,整个架构将成为消息的一部分。
    ProducerRecord[String,genericord]
    有什么问题吗?然后把其余的调用放在序列化程序中?有些项目可能会有很大的卷,所以我认为序列化会给我带来一些性能提升。因此,当我使用Confluent序列化程序时,这将从通用记录中剥离模式?不过,Kafka序列化程序接口旨在为您获取字节数组。在类的“主方法”中编写该逻辑没有任何好处谢谢,我想我做了一个错误的假设,即GenericRecord只是需要外部模式才能读取的二进制avro数据。GenericRecord就像一个Hashmap。仍然存在命名字段,因此需要某种方法来解析这些字段并知道它们是否存在谢谢,我猜我做了一个错误的假设,即GenericRecord只是需要外部模式才能读取的二进制avro数据。GenericRecord就像一个Hashmap。仍然存在命名字段,因此需要某种方法来解析这些字段并知道它们是否存在