2016-11-28 128 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。不幸的是,目前不可能引用来自其他模式文件的类型。