二进制编码的 AVRO 与 JSON 编码的 AVRO 之间的区别

Rak*_*aks 2 python python-3.x avro

根据 AVRO 文档,对于二进制编码的 AVRO,我知道有两个重要方面。一种是 AVRO 模式,即:.avsc(以 JSON 表示),它描述数据的字段,然后是二进制编码的实际数据。

关于 JSON 编码的 AVRO 的文档很少,所以我试图了解它是否遵循相同的语义,其中我们将拥有 JSON 格式的 AVRO 模式文件(即:.avsc 文件),后跟以 JSON 编码的数据的有效负载?或者它是否只是完全 JSON 编码的有效负载,其中每个键的值都是二进制编码的?

尝试使用 Python 进行实验,以便任何线索/示例代码都会有所帮助。

谢谢!

小智 5

二进制和 JSON 编码仅与有效负载本身有关。例如,如果您有这样的架构:

{
  "type": "record",
  "name": "test",
  "fields" : [
    {"name": "a", "type": "long"},
    {"name": "b", "type": "string"}
  ]
}
Run Code Online (Sandbox Code Playgroud)

并且您有一条记录,其a字段的值为27,其b字段的值为foo,则二进制编码将是以下十六进制字节序列:

36 06 66 6f 6f
Run Code Online (Sandbox Code Playgroud)

而 JSON 编码则很简单:

{"a": 27, "b": "foo"}
Run Code Online (Sandbox Code Playgroud)

二进制格式更加紧凑,但 JSON 格式当然更具可读性。

当您谈论将架构和有效负载编码为一个输出的语义时,您实际上是在谈论 avro 容器文件(https://avro.apache.org/docs/current/spec.html#Object+Container+Files)并且那些仅使用二进制编码。对于使用 JSON 编码的容器文件没有规范。无需任何先验知识即可解析 avro 文件,因为架构已烘焙到文件中,但 JSON 编码的 avro 始终需要架构作为输入,因为它不会像 avro 文件那样烘焙到结果中。

如果您使用的是 Python,avro据我所知,标准库不支持 JSON 编码,但它fastavro支持。用于阅读和写作的文档如下:

https://fastavro.readthedocs.io/en/latest/json_reader.html https://fastavro.readthedocs.io/en/latest/json_writer.html