1

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

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

现在在网上阅读时,它看起来Avro需要一个模式......我不确定如何在 ApacheAvro中为我的 JSON 文档提出一个模式。

下面是我JSON在使用 Jackson 对其进行序列化后写入 Cassandra 的文档。现在如何Avro为下面的 JSON 提供一个模式?

{
  "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 中提出一个模式?谢谢您的帮助。

4

1 回答 1

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 的真正好处。

希望这可以帮助!

于 2013-09-26T15:00:38.697 回答