Avro序列化:序列化为字节数组后,键的长度如何影响数据大小?

时间:2020-08-20 09:25:23

标签: serialization deserialization avro

我创建了两个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}
     ]
}

1 个答案:

答案 0 :(得分:1)

不保存密钥,avro序列化根据字段的类型和顺序工作。在您的情况下,您可以使用:

  • 记录-这是字段的串联
  • 字符串很长,然后是字符的UTF-8编码
  • 两种类型的联合,它必须先指定它是哪种类型,然后才使用这种类型的编码

为此值:

{
    "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