2015-09-25 33 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

將它添加到記錄時不會失敗,它在嘗試序列化時會失敗,因爲它在嘗試匹配類型時就會失敗。據我所知,這是它唯一的類型檢查。