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

Avro serialization: How does the length of keys effect the size of data after serialisation as byte array?

我创建了两个 Avro 模式,一个是短键,另一个是长键。我将相同的数据放在它们上面,并将它们序列化为 byte array。 然后,我检查了长度,是一样的。

如果不影响数据的大小,那么密钥是如何保存的?

我测试的架构:

{
"namespace": "namespace",
 "type": "record",
 "name": "TestA",
 "fields": [
     {"name": "dataFieldIsVeryVeryVeryLong", "type": "string"},
     {"name": "dataField2IsVeryVeryVeryVerylong", "type": ["null", "string"], "default": null}
     ]
}

{
"namespace": "namespace",
 "type": "record",
 "name": "TestB",
 "fields": [
     {"name": "s", "type": "string"},
     {"name": "ss", "type": ["null", "string"], "default": null}
     ]
}

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

  • 记录 - 它是字段的串联
  • string对length比较长然后对字符进行UTF-8编码
  • 两种类型的联合,它有int指定它是哪种类型,然后它使用这种类型编码

对于这个值:

{
    "s": "qwe",
    "ss": null
}

十六进制编码将是 06 71 77 65 00 - 我们知道这是一条记录,所以我们进行字段编码。 first是一个字符串,对于一个字符串first是一个长度,06是一个long 3的avro编码,所以接下来的3个值就是一个字符串内容。如果您使用十六进制值搜索 ASCII table,您会看到 71 是 q,77 是 w,65 是 e。 下一个字段是 union,所以编码有 int 类型,00 是 int 0 的 avro 编码,所以首先在 union 中输入。在您的情况下这是“null”,null 被编码为无字节,所以这是数据的结尾。如果它是 02,那将意味着在位置 1 上键入 - 架构中的字符串,它会跟随字符串值的编码。

您可以在 documentation

中阅读更多相关信息

如果您想查看更多示例,我写了一个 post 关于它的文章