首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当json中没有任何字段不总是相同时,Avro Schema

当json中没有任何字段不总是相同时,Avro Schema
EN

Stack Overflow用户
提问于 2016-02-03 14:20:42
回答 1查看 1.5K关注 0票数 2

我使用的是合流卡夫卡平台。为了生成主题的消息,我给出了一个由16个字段组成的Avro模式。现在,传入的记录将只有这16个字段的数据,但不是全部。对每个字段使用默认值无助于此讨论中指出。这个问题的解决办法是什么?

样本代码:

代码语言:javascript
复制
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);}
});

错误:

代码语言:javascript
复制
message: 'Conversion of JSON to Avro failed: Failed to convert JSON to Avro: Expected field name not found: iptime'

任何帮助都要感谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-03 15:38:53

从阅读Avro 规格说明可以看出,默认设置应该允许您做您想做的事情:

默认值:此字段的默认值,在读取缺少此字段的实例时使用。

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

代码语言:javascript
复制
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); }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35179580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档