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 关于它的文章
我创建了两个 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 关于它的文章