2016-11-28 134 views
1

this question上築巢Avro的模式,窩正確的方式記錄模式如下:嵌套的Avro模式

{ 
    "name": "person", 
    "type": "record", 
    "fields": [ 
     {"name": "firstname", "type": "string"}, 
     {"name": "lastname", "type": "string"}, 
     { 
      "name": "address", 
      "type": { 
         "type" : "record", 
         "name" : "AddressUSRecord", 
         "fields" : [ 
          {"name": "streetaddress", "type": "string"}, 
          {"name": "city", "type": "string"} 
         ] 
        }, 
     } 
    ] 
} 

我不喜歡給該域的名稱address,不得不給予不同名稱(AddressUSRecord)添加到字段的模式。我可以給字段和架構使用相同的名稱,address

如果我想在多個其他模式中使用AddressUSRecord模式,而不僅僅是person?如果我想在另一個模式中使用AddressUSRecord,我們假設business,我是否必須將其命名爲其他的?

理想情況下,我想在單獨的模式中定義AddressUSRecord,然後讓address的類型參考AddressUSRecord。但是,Avro 1.8.1支持這種開箱即用的功能並不清楚。這2014 article表明子模式需要用自定義代碼來處理。在Avro 1.8.1中定義可重用架構的最佳方式是什麼?

注意:我想要一個與Confluent公司的架構註冊表一起使用的解決方案。有一個Google Groups thread似乎表明,架構註冊表不能很好地使用模式引用。

回答

6

我可以給字段和模式使用相同的名稱,地址嗎?

是的,您可以使用與字段名稱相同的名稱命名該記錄。

如果我想在多個其他模式中使用AddressUSRecord模式,而不僅僅是人?

您可以使用使用一對夫婦的技術的多個模式:在Avro的模式解析器的客戶端(JVM和其他)允許您一般通過names參數指定多個模式,(在Java Schema$Parser/parse方法允許多模式String參數) 。

然後,您可以指定相關的架構爲命名類型:

{ 
    "type": "record", 
    "name": "Address", 
    "fields": [ 
    { 
     "name": "streetaddress", 
     "type": "string" 
    }, 
    { 
     "name": "city", 
     "type": "string" 
    } 
    ] 
} 

並通過解析器父架構之前運行此:

{ 
    "name": "person", 
    "type": "record", 
    "fields": [ 
    { 
     "name": "firstname", 
     "type": "string" 
    }, 
    { 
     "name": "lastname", 
     "type": "string" 
    }, 
    { 
     "name": "address", 
     "type": "Address" 
    } 
    ] 
} 

順便說一句,這可以讓你從不同的文件解析。

或者,您也可以解析引用以同樣的方式模式單一聯盟的模式:

[ 
    { 
    "type": "record", 
    "name": "Address", 
    "fields": [ 
     { 
     "name": "streetaddress", 
     "type": "string" 
     }, 
     { 
     "name": "city", 
     "type": "string" 
     } 
    ] 
    }, 
    { 
    "type": "record", 
    "name": "person", 
    "fields": [ 
     { 
     "name": "firstname", 
     "type": "string" 
     }, 
     { 
     "name": "lastname", 
     "type": "string" 
     }, 
     { 
     "name": "address", 
     "type": "Address" 
     } 
    ] 
    } 
] 

我想,隨着匯合公司的架構註冊有效的解決方案。

架構註冊表不支持單獨解析模式,但不支持解析成一個聯盟式的後一個例子。

0

您可以將namespace設置爲記錄類型,然後在隨後的字段中使用{namespace}.{name}作爲參數type。不幸的是,目前不可能引用來自其他模式文件的類型。