【问题标题】:Difference between Binary encoded AVRO v/s JSON encoded AVRO二进制编码的 AVRO 与 JSON 编码的 AVRO 之间的区别
【发布时间】:2021-11-11 03:41:32
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: python python-3.x avro


    【解决方案1】:

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

    {
      "type": "record",
      "name": "test",
      "fields" : [
        {"name": "a", "type": "long"},
        {"name": "b", "type": "string"}
      ]
    }
    

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

    36 06 66 6f 6f
    

    而 JSON 编码只是:

    {"a": 27, "b": "foo"}
    

    二进制格式更紧凑,当然 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

    【讨论】:

    • 非常感谢@Scott 的详细解释。几个后续问题:1)您提到“可以在没有任何先验知识的情况下解析 avro 文件,因为模式已被烘焙到文件中”。您是指没有架构文件的二进制编码的 AVRO 有效负载,还是指的是 AVRO 中的二进制编码的对象容器文件? 2) 鉴于一个必须拥有 AVRO 模式文件来读取 JSON 编码的 AVRO 有效负载,通用 JSON 模式推理引擎是否可以直接获取 JSON 编码的 AVRO 有效负载并理解它,而无需参考架构文件?
    • 1) 我指的是对象容器文件。如果您所拥有的只是二进制编码的avro,例如我的答案中的36 06 66 6f 6f,那么您肯定需要提供一个架构来解析它。 2)您可以尝试这样做(并且可能有图书馆尝试这样做),但它会有很多失败的机会。例如,在我有 JSON 输出和 "b": "foo" 的答案中,试图推断架构的东西不会知道 b 字段是字符串类型还是枚举类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 2014-12-29
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多