我创建了两个Avro模式,一个具有短键,另一个具有长键。我在它们上放置了相同的数据,并将它们序列化为byte array
。
然后,我检查了长度,这是相同的。
如果不影响数据大小,那么如何保存密钥?
我测试过的模式:
{
"namespace": "namespace",
"type": "record",
"name": "TestA",
"fields": [
{"name": "dataFieldIsVeryVeryVeryLong", "type": "string"},
{"name": "dataField2IsVeryVeryVeryVerylong", "type": ["null", "string"], "default": null}
]
}
AND
{
"namespace": "namespace",
"type": "record",
"name": "TestB",
"fields": [
{"name": "s", "type": "string"},
{"name": "ss", "type": ["null", "string"], "default": null}
]
}
答案 0 :(得分:1)
不保存密钥,avro序列化根据字段的类型和顺序工作。在您的情况下,您可以使用:
为此值:
{
"s": "qwe",
"ss": null
}
十六进制编码为06 71 77 65 00
-我们知道它是一条记录,因此我们进行字段编码。首先是字符串,因为字符串首先是长度,06
是长3的avro编码,所以接下来的3个值是字符串内容。如果使用十六进制值搜索ASCII表,您将看到71
是q,77
是w,65
是e。
下一个字段是并集,因此编码具有类型为int的int,00
是对int 0的avro编码,因此联合中的第一个类型。在您的情况下为“ null”,null被编码为无字节,因此这就是数据的结尾。如果它是02
,则表示位置1上的类型-模式中的字符串,并且后面跟着字符串值的编码。
您可以在documentation
中了解更多信息如果您想查看更多示例,我为此写了post