2015-09-25 82 views
0

我有以下的Avro架构Avro的genericdata.Record忽略的数据类型

{ "namespace": "example.avro", 
    "type": "record", 
    "name": "User", 
    "fields": [ 
      {"name": "name", "type": "string"}, 
      {"name": "favorite_number", "type": ["int", "null"]}, 
      {"name": "favorite_color", "type": ["string", "null"]} 
      ] 
} 

我用下面的代码片段设置一个记录

val schema = new Schema.Parser().parse(new File("data/user.avsc")) 
val user1 = new GenericData.Record(schema) //strangely this schema only checks for valid fields NOT types. 
user1.put("name", "Fred") 
user1.put("favorite_number", "Jones") 

我本来以为,这将无法验证针对该架构

当我添加行

user1.put("last_name", 100) 

它会产生一个运行时错误,这也是我期望的第一种情况。

在线程异常 “主要” org.apache.avro.AvroRuntimeException:不是有效的架构领域:在org.apache.avro.generic.GenericData $ Record.put(GenericData.java:125) 姓氏 在csv2avro $。主要(csv2avro.scala:40) 在csv2avro.main(csv2avro.scala)

这是怎么回事吗?

+0

Avro只会在尝试序列化记录时检查类型和字段名称。在你的情况下,last_name没有在模式中声明。 – alexeipab

回答

0

将它添加到记录时不会失败,它在尝试序列化时会失败,因为它在尝试匹配类型时就会失败。据我所知,这是它唯一的类型检查。