在我的JSON文档上设计Avro架构

时间:2013-09-15 08:01:10

标签: java json jackson avro

这些天我一直在阅读很多关于Apache Avro的内容,我更倾向于使用它而不是使用JSON。目前,我们正在做的是,我们使用JSON序列化Jackson文档,然后为每个JSON将序列化Cassandra文档写入row key/user id

然后我们有一个REST服务,它使用行键读取整个JSON文档,然后反序列化并进一步使用它。

现在,在Web上阅读时,Avro需要预先设置架构...我不知道如何在Apache Avro中为我的JSON文档提供架构。

以下是我使用Jackson序列化后写入Cassandra的JSON文档。现在,如何为下面的JSON提出Avro架构?

{
  "lv" : [ {
    "v" : {
      "site-id" : 0,
      "categories" : {
        "321" : {
          "price_score" : "0.2",
          "confidence_score" : "0.5"
        },
        "123" : {
          "price_score" : "0.4",
          "confidence_score" : "0.2"
        }
      },
      "price-score" : 0.5,
      "confidence-score" : 0.2
    }
  } ],
  "lmd" : 1379231624261
}

任何人都可以提供一个简单的例子,如何在我上面的JSON文档中基于Avro提出架构?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

如上所述,定义avro架构的最简单方法是从他们称之为IDL的方式开始。 IDL是一种高级语言,而不是Avro架构(json),使得编写avro架构变得更加直接..

请参阅此处的avro IDL:http://avro.apache.org/docs/current/idl.html

要在JSON中定义上面的内容,您将在IDL中定义一组看起来像这样的记录:

@namespace("com.sample")
protocol sample {
   record Category {
      union {null, string} price_score = null;
      union {null, string} confidence_score = null;
   }
   record vObject {
      int site_id = 0;
      union {null, map<Category>} categories = null;
      union {null, float} price_score = null;
      union {null, float} confidence_score = null;
   }

   record SampleObject {
      union {null, array<vObject>} lv = null;
      long lmd = -1;
   }
}

当您运行编译器工具(如上面的网站上所列)时,您将获得如下生成的avro架构:

{
  "protocol" : "sample",
  "namespace" : "com.sample",
  "types" : [ {
    "type" : "record",
    "name" : "Category",
    "fields" : [ {
      "name" : "price_score",
      "type" : [ "null", "string" ],
      "default" : null
    }, {
      "name" : "confidence_score",
      "type" : [ "null", "string" ],
      "default" : null
    } ]
  }, {
    "type" : "record",
    "name" : "vObject",
    "fields" : [ {
      "name" : "site_id",
      "type" : "int",
      "default" : 0
    }, {
      "name" : "categories",
      "type" : [ "null", {
        "type" : "map",
        "values" : "Category"
      } ],
      "default" : null
    }, {
      "name" : "price_score",
      "type" : [ "null", "float" ],
      "default" : null
    }, {
      "name" : "confidence_score",
      "type" : [ "null", "float" ],
      "default" : null
    } ]
  }, {
    "type" : "record",
    "name" : "SampleObject",
    "fields" : [ {
      "name" : "lv",
      "type" : [ "null", {
        "type" : "array",
        "items" : "vObject"
      } ],
      "default" : null
    }, {
      "name" : "lmd",
      "type" : "long",
      "default" : -1
    } ]
  } ],
  "messages" : {
  }
}

使用您想要的任何语言,您现在可以生成一组对象,默认的“toString”操作将以JSON格式输出,如上所示。然而,Avro的真正威力来自它的压缩功能。你应该真正用avro二进制格式写出来看看avro的真正好处。

希望这有帮助!