json - 当 json 中的字段不总是相同时的 Avro 架构

标签 json apache-kafka avro

我正在使用融合的卡夫卡平台。为了生成某个主题的消息,我给出了包含 16 个字段的 Avro 模式。现在传入的记录将仅包含这 16 个字段的数据,而不是全部。正如 discussion 中指出的那样,为每个字段使用默认值并没有帮助。 。 这个问题有什么解决办法吗?

示例代码:

var KafkaRest = require('kafka-rest');
var AvroSchemais = new KafkaRest.AvroSchema({
    "name": "Mydata",
    "type": "record",
    "fields": [
        { "name": "id", "type": "string" },
        {"name" : "data", 
                     "type" : {
                         "type" : "array",
                         "items" :{
                            "name":"manyfields",
                            "type":"record",
                            "fields" : [
                            {"name" : "ip", 
                             "type" : "string", 
                             "default" : "NONE"},

                            {"name" : "iptime", 
                             "type" : "string", 
                             "default" : "NONE"},

                            {"name" : "mcc", 
                             "type" : "string", 
                             "default" : "NONE"},

                            {"name" : "mnc", 
                             "type" : "string", 
                             "default" : "NONE"},

                              {"name" : "cid", 
                             "type" : "string", 
                             "default" : "NONE"},

                             {"name" : "lac", 
                             "type" : "string", 
                             "default" : "NONE"}
                    ]}}}]});
topic.produce(AvroSchema, {'id':'abcd','data': [{"ip":"12.12.12.12","lac":"1234"}]},function(err, res){
    if (err){console.log(err);}
    else{console.log(res);}
});

错误:

message: 'Conversion of JSON to Avro failed: Failed to convert JSON to Avro: Expected field name not found: iptime'

感谢任何帮助!!

最佳答案

来自阅读 Avro specification ,看来默认值应该让你做你想做的事:

default: A default value for this field, used when reading instances that lack this field

也许您使用的反序列化器没有针对 JSON 编码实现此功能。同时,您可以使用avsc通过自动填充缺少的字段来解决此问题:

var KafkaRest = require('kafka-rest'),
    avro = avsc;

var attrs = {
  "name": "Mydata",
  "type": "record",
  "fields": [ /* ... */ ]
};
var AvroSchema = new KafkaRest.AvroSchema(attrs);
var type = avro.parse(attrs);

var withoutDefaults = {'id': 'abcd','data': [{"ip":"12.12.12.12", "lac":"1234"}]};
var withDefaults = type.clone(withoutDefaults); // All defaults are present here.

topic.produce(AvroSchema, withDefaults, function (err, res){
  if (err) { console.log(err); }
  else { console.log(res); }
});

关于json - 当 json 中的字段不总是相同时的 Avro 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35179580/

相关文章:

mysql - Confluence jdbc 连接器无法使用时间戳列进行增量查询

java - 使用 KafkaAvroDecoder 将 Avro 消息反序列化为特定数据

java - jackson json 到 Object 解析

jquery - 用 jquery 用 html 文本写 json 数据的例子

javascript - getJSON 回调未执行

scala - 将 Spark-kafka InputDStream 转换为 Array[Bytes]

hadoop - 从HIVE表作为AVRO文件加载到HDFS中

javascript - Node : Display POST data from another website

python - 两个永无休止的Python脚本之间的交互

java - 使用spring创建多个kafka主题