2015-07-02 15 views
1

我的數據模型有很少的固定字段和一個可變字段塊。變量字段作爲一個塊,可以在同一個記錄中重複o次n次。如何表示Avro模式中的重複字段?

對象的人可以用作比喻。該名稱在每條記錄中只有一個條目,但他可以具有o到n個地址,並且該字段地址也具有結構。有沒有一種方法可以通過地址模式來查找該人擁有的任意數量的地址?我如何在Avro模式文件中提到這一點?

回答

3

您是否嘗試過使用嵌套的Avro架構。這應該解決您的一人多地址需求。這是一個有用的模式。

{ 
    "type": "record", 
    "name" : "person", 
    "namespace" : "com.testavro", 
    "fields": [ 
     { "name" : "personname", "type": ["null","string"] }, 
     { "name" : "personId", "type": ["null","string"] }, 
     { "name" : "Addresses", "type": { 
      "type": "array", 
      "items": [ { 
       "type" : "record", 
       "name" : "Address", 
       "fields" : [ 
       { "name" : "addressLine1", "type": ["null", "string"] }, 
       { "name" : "addressLine2", "type": ["null", "string"] }, 
       { "name" : "city", "type": ["null", "string"] }, 
       { "name" : "state", "type": ["null", "string"] }, 
       { "name" : "zipcode", "type": ["null", "string"] } 
       ] 
      }] 
      } 
     } 
    ] 
} 

當使用上述avro模式生成代碼時,您將獲得person類和Address類。對於個人類(僅限域聲明)自動生成的類看起來像

/** 
    * RecordBuilder for person instances. 
    */ 
    public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase<person> 
    implements org.apache.avro.data.RecordBuilder<person> { 

    private java.lang.String personname; 
    private java.lang.String personId; 
    private java.util.List<java.lang.Object> Addresses; 

和地址類(僅限域聲明)看起來像

/** 
    * RecordBuilder for Address instances. 
    */ 
    public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase<Address> 
    implements org.apache.avro.data.RecordBuilder<Address> { 

    private java.lang.String addressLine1; 
    private java.lang.String addressLine2; 
    private java.lang.String city; 
    private java.lang.String state; 
    private java.lang.String zipcode; 

難道這就是你要找的人?

+0

它像一個魅力工作。非常感謝。 – mkg90

+0

@mkg:那麼你應該標記爲已回答 – roundcrisis