gpt4 book ai didi

serialization - Avro 特定与通用记录类型 - 哪个最好,或者我可以在两者之间转换?

转载 作者:行者123 更新时间:2023-12-04 21:37:48 25 4
gpt4 key购买 nike

我们正试图在为我们的客户提供通用和特定记录格式之间做出决定
着眼于提供在线模式注册表,客户端可以在模式更新时访问。
我们希望发送以几个字节为前缀的序列化 blob,这些字节表示版本号,因此架构
从我们的注册表中检索可以自动化。

现在,我们遇到了代码示例,说明了通用格式的相对适应性
模式更改,但我们不愿意放弃特定类型提供的类型安全性和易用性
格式。

有没有办法两全其美? IE。我们可以使用和操作特定生成的
内部类,然后让它们在序列化之前自动将它们转换为通用记录?
然后客户端将反序列化通用记录(在查找模式之后)。

此外,客户是否可以将他们收到的这些通用记录稍后转换为特定记录?一些小代码示例会有所帮助!

或者我们是否以错误的方式看待这一切?

最佳答案

您正在寻找的是 Confluent Schema 注册表服务和有助于与此集成的库。

提供一个示例来编写 Serialize De-serialize avro 数据的演变模式。请注意提供来自 Kafka 的样本。

import io.confluent.kafka.serializers.KafkaAvroDeserializer;  
import io.confluent.kafka.serializers.KafkaAvroSerializer;
import org.apache.avro.generic.GenericRecord;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;

import java.util.HashMap; import java.util.Map;

public class ConfluentSchemaService {

public static final String TOPIC = "DUMMYTOPIC";

private KafkaAvroSerializer avroSerializer;
private KafkaAvroDeserializer avroDeserializer;

public ConfluentSchemaService(String conFluentSchemaRigistryURL) {

//PropertiesMap
Map<String, String> propMap = new HashMap<>();
propMap.put("schema.registry.url", conFluentSchemaRigistryURL);
// Output afterDeserialize should be a specific Record and not Generic Record
propMap.put("specific.avro.reader", "true");

avroSerializer = new KafkaAvroSerializer();
avroSerializer.configure(propMap, true);

avroDeserializer = new KafkaAvroDeserializer();
avroDeserializer.configure(propMap, true);
}

public String hexBytesToString(byte[] inputBytes) {
return Hex.encodeHexString(inputBytes);
}

public byte[] hexStringToBytes(String hexEncodedString) throws DecoderException {
return Hex.decodeHex(hexEncodedString.toCharArray());
}

public byte[] serializeAvroPOJOToBytes(GenericRecord avroRecord) {
return avroSerializer.serialize(TOPIC, avroRecord);
}

public Object deserializeBytesToAvroPOJO(byte[] avroBytearray) {
return avroDeserializer.deserialize(TOPIC, avroBytearray);
} }

以下类(class)包含您正在寻找的所有代码。
io.confluent.kafka.serializers.KafkaAvroDeserializer;
io.confluent.kafka.serializers.KafkaAvroSerializer;

请点击链接了解更多详情:

http://bytepadding.com/big-data/spark/avro/avro-serialization-de-serialization-using-confluent-schema-registry/

关于serialization - Avro 特定与通用记录类型 - 哪个最好,或者我可以在两者之间转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33882095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com