【问题标题】:Avro schema specification won't take same namespaceAvro 模式规范不会采用相同的命名空间
【发布时间】:2015-06-27 09:21:50
【问题描述】:

我定义了一个模式:

{ "namespace":"configschemas.avro",
  "type":"record",
  "name":"pathObject",
  "fields":
  [
    {   "name":"pathString", 
        "type" : "string", 
        "default" : "null"
    }
    ,
    {   "name":"needsConversion",
         "type" : "boolean" ,
          "default" : false
    }
    ]
}

编译上述架构后,第二个架构将无法编译。

{ "namespace" : "configschemas.avro",
  "type" : "array" , 
  "items" : configschemas.avro.pathObject
}

所有模式都在同一目录下,命名空间也相同。找不出缺陷。

编译第二个架构时出错:

Input files to compile:
  logPaths.avsc
Exception in thread "main" org.apache.avro.SchemaParseException: org.codehaus.jackson.JsonParseException: Unexpected character ('p' (code 112)): expected a vali
d value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: logPaths.avsc; line: 3, column: 13]
        at org.apache.avro.Schema$Parser.parse(Schema.java:967)
        at org.apache.avro.Schema$Parser.parse(Schema.java:932)
        at org.apache.avro.tool.SpecificCompilerTool.run(SpecificCompilerTool.java:73)
        at org.apache.avro.tool.Main.run(Main.java:84)
        at org.apache.avro.tool.Main.main(Main.java:73)
Caused by: org.codehaus.jackson.JsonParseException: Unexpected character ('p' (code 112)): expected a valid value (number, String, array, object, 'true', 'false
' or 'null')
 at [Source: logPaths.avsc; line: 3, column: 13]
        at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433)
        at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521)
        at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:442)
        at org.codehaus.jackson.impl.Utf8StreamParser._handleUnexpectedValue(Utf8StreamParser.java:2090)
        at org.codehaus.jackson.impl.Utf8StreamParser.nextToken(Utf8StreamParser.java:555)
        at org.codehaus.jackson.map.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:192)
        at org.codehaus.jackson.map.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:58)
        at org.codehaus.jackson.map.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:15)
        at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
        at org.codehaus.jackson.map.ObjectMapper.readTree(ObjectMapper.java:1344)
        at org.apache.avro.Schema$Parser.parse(Schema.java:965)
        ... 4 more** 

【问题讨论】:

    标签: schema avro


    【解决方案1】:

    我不确定您是如何调用架构解析器的,但是将两个架构放在同一个架构文件中应该可以工作,因为这表明

    @Grapes([
        @Grab(group='org.apache.avro', module='avro', version='1.7.7')
    ])
    
    import org.apache.avro.Schema;
    
    String schema = '''
    {
      "namespace":"configschemas.avro",
      "type":"record",
      "name":"pathObject",
      "fields":[
        {
          "name":"pathString", 
          "type":"string", 
          "default":"null"
        },
        {
          "name":"needsConversion",
          "type":"boolean",
          "default":false
        }
      ]
    }
    
    {
      "namespace":"configschemas.avro",
      "type":"array", 
      "items":configschemas.avro.pathObject
    }'''
    
    try {
        System.out.println(new Schema.Parser().parse(schema));
    } catch (Throwable t) {
        t.printStackTrace();
    }
    

    因此,如果您将命名空间中的所有架构一起加载,它应该可以工作(您可以将它们保存在单独的文件中,只需将文件中的文本一起加载)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多