2015-05-27 27 views
0

我有一個問題之前,我將JSON文件轉換爲avro format。但是,在這種情況下,JSON數據變化的字段值,例如:Json到Avro轉換在不同領域的JSON文件

{"a":"x1", "b":"x2": "c":"x3"} 

    {"b":"x4", "d":"x5"} 

我有一個工作代碼,其中每個條目中的字段保持相同的文件轉換。但是作爲模式定義語言的avro不能支持上述數據(具有不同的字段)。

我有一個基本的問題,如果它甚至可以使用架構並將其轉換爲avro格式這種情況下?還是有任何其他工具可以用來完成這項任務?

回答

0

其中一種方法是創建一個模式,它是所有可能字段的超集,並將null保留爲你沒有的字段(我認爲這是您在問題中隱含的方法,空值由工會定義在Avro的,所以它會是這個樣子

{ 
    "type":"record", 
    "namespace":"com.mycompany", 
    "name":"MYRECORD", 
    "fields":[ 
     { 
      "name":"a", 
      "type":["string", "null"] 
     }, 
     { 
      "name":"b", 
      "type":["string", "null"] 
     }, 
     { 
      "name":"c", 
      "type":["string", "null"] 
     } 
    ] 
} 

如果它是不可能知道所有的前期領域,另一種方法是有一個模式就是喜歡

{ 
    "type":"record", 
    "namespace":"com.mycompany", 
    "name":"MYRECORD", 
    "fields":[ 
     { 
     "name":"TheFields", 
     "type":"map", 
     "values":"string" 
     } 
    ] 
} 

但這隻有當你的所有領域都屬於同一類型,你纔會有效e編寫自己的代碼來解析JSON並將其推入地圖。

這些是我能想到的唯一選擇。 Avro中沒有相應的XML模式<xs:any>。嚴格的模式一致性是設計所固有的。