这些天我一直在阅读很多关于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提出架构?谢谢你的帮助。
答案 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的真正好处。
希望这有帮助!