2015-03-26 13 views
5

Tôi khá mới đối với Avro và trải qua tài liệu về các loại lồng nhau. Tôi có ví dụ dưới đây làm việc độc đáo nhưng nhiều loại khác nhau trong mô hình sẽ có địa chỉ. Có thể định nghĩa tệp address.avsc và tham chiếu đó dưới dạng kiểu lồng nhau không? Nếu có thể, bạn cũng có thể tiến thêm một bước nữa và có danh sách Địa chỉ cho Khách hàng không? Cảm ơn trước.Định nghĩa lược đồ Avro làm tổ các loại

{"namespace": "com.company.model", 
    "type": "record", 
    "name": "Customer", 
    "fields": [ 
    {"name": "firstname", "type": "string"}, 
    {"name": "lastname", "type": "string"}, 
    {"name": "email", "type": "string"}, 
    {"name": "phone", "type": "string"}, 
    {"name": "address", "type": 
     {"type": "record", 
     "name": "AddressRecord", 
     "fields": [ 
     {"name": "streetaddress", "type": "string"}, 
     {"name": "city", "type": "string"}, 
     {"name": "state", "type": "string"}, 
     {"name": "zip", "type": "string"} 
     ]} 
    } 
    ] 
} 

Trả lời

15

Có 4 cách có thể:

  1. Bao gồm nó trong tập tin pom như đã đề cập trong ticket này.
  2. Khai báo tất cả các loại của bạn trong một tệp avsc duy nhất.
  3. Sử dụng một trình phân tích cú pháp tĩnh duy nhất trước tiên phân tích tất cả các lần nhập và sau đó phân tích cú pháp các loại dữ liệu thực tế.
  4. (Đây là bản hack) Sử dụng tệp avdl và sử dụng các mục nhập như https://avro.apache.org/docs/1.7.7/idl.html#imports. Mặc dù, IDL dành cho các cuộc gọi RPC.

Ví dụ về 2. Khai báo tất cả các loại của bạn trong một tệp avsc duy nhất. Cũng trả lời khai báo mảng trên địa chỉ.

[ 
{ 
    "type": "record", 
    "namespace": "com.company.model", 
    "name": "AddressRecord", 
    "fields": [ 
     { 
      "name": "streetaddress", 
      "type": "string" 
     }, 
     { 
      "name": "city", 
      "type": "string" 
     }, 
     { 
      "name": "state", 
      "type": "string" 
     }, 
     { 
      "name": "zip", 
      "type": "string" 
     } 
    ] 
}, 
{ 
    "namespace": "com.company.model", 
    "type": "record", 
    "name": "Customer", 
    "fields": [ 
     { 
      "name": "firstname", 
      "type": "string" 
     }, 
     { 
      "name": "lastname", 
      "type": "string" 
     }, 
     { 
      "name": "email", 
      "type": "string" 
     }, 
     { 
      "name": "phone", 
      "type": "string" 
     }, 
     { 
      "name": "address", 
      "type": { 
       "type": "array", 
       "items": "com.company.model.AddressRecord" 
      } 
     } 
    ] 
}, 
{ 
    "namespace": "com.company.model", 
    "type": "record", 
    "name": "Customer2", 
    "fields": [ 
     { 
      "name": "x", 
      "type": "string" 
     }, 
     { 
      "name": "y", 
      "type": "string" 
     }, 
     { 
      "name": "address", 
      "type": { 
       "type": "array", 
       "items": "com.company.model.AddressRecord" 
      } 
     } 
    ] 
} 
] 

Ví dụ cho 3. Sử dụng một phân tích cú pháp tĩnh duy nhất

Parser parser = new Parser(); // Make this static and reuse 
parser.parse(<location of address.avsc file>); 
parser.parse(<location of customer.avsc file>); 
parser.parse(<location of customer2.avsc file>); 

Nếu chúng ta muốn có một tổ chức của các Schema, có nghĩa là nếu chúng ta muốn tạo ra kỷ lục mới, chúng ta có thể hoặc là làm https://avro.apache.org/docs/1.5.4/api/java/org/apache/avro/Schema.Parser.html#getTypes() để lấy lược đồ hoặc

Parser parser = new Parser(); // Make this static and reuse 
Schema addressSchema =parser.parse(<location of address.avsc file>); 
Schema customerSchema=parser.parse(<location of customer.avsc file>); 
Schema customer2Schema =parser.parse(<location of customer2.avsc file>); 
+0

Không rõ cách sử dụng trình phân tích cú pháp trong ví dụ # 3. Một khi nó được tạo ra, làm thế nào để đi về việc tạo một bản ghi (một bản ghi trống, không deserialize) – RedBullet

+0

@ RedBullet Tôi đã chỉnh sửa câu trả lời của tôi để làm rõ nghi ngờ của bạn. Hy vọng nó là rõ ràng bây giờ. –

+0

Trong # 2, loại gốc của bạn là một UNION, phải không? Vì vậy, điều đó sẽ cho phép người dùng tuần tự hóa bất kỳ loại cấp cao nhất nào như đối tượng gốc? Đó là một chút không may bởi vì nếu bạn chỉ muốn serialize các đối tượng khách hàng ở cấp cao nhất, bạn không thể thực sự làm cho nó hoạt động theo cách đó. – Shannon

Các vấn đề liên quan