2014-04-08 24 views
21

Tôi đang gặp phải một số sự cố khi thiết lập giá trị mặc định cho trường avro. Tôi có một giản đồ đơn giản như đưa ra dưới đây:Giá trị mặc định của trường Avro

data.avsc:

{ 
"namespace":"test", 
"type":"record", 
"name":"Data", 
"fields":[ 
    { "name": "id", "type": [ "long", "null" ] }, 
    { "name": "value", "type": [ "string", "null" ] }, 
    { "name": "raw", "type": [ "bytes", "null" ] } 
] 
} 

Tôi đang sử dụng v1.7.6 Avro-maven-plugin để tạo ra các mô hình java.

Khi tôi tạo ra một thể hiện của các mô hình sử dụng

Data data = Data.newBuilder().build();, nó không thành công với một org.apache.avro.AvroRuntimeException ngoại lệ: org.apache.avro.AvroRuntimeException: Dòng id loại: UNION pos: 0 không được thiết lập và không có giá trị mặc định.

Nhưng nếu tôi xác định "mặc định" tài sản,

{ "name": "id", "type": [ "long", "null" ], "default": "null" }, 

Tôi không nhận được lỗi này. Tôi đọc trong tài liệu mà lược đồ đầu tiên trong liên minh trở thành lược đồ mặc định. Vì vậy, câu hỏi của tôi là, tại sao tôi vẫn cần chỉ định thuộc tính "mặc định"? Làm cách nào khác để tôi tạo trường tùy chọn?

Và nếu tôi cần xác định các giá trị mặc định, cách thức hoạt động của một liên minh; thế nào để tôi cần phải xác định giá trị mặc định cho mỗi lược đồ trong liên minh và làm thế nào để làm việc về thứ tự/cú pháp?

Cảm ơn.

Trả lời

30

Giá trị mặc định của công đoàn tương ứng với giản đồ đầu tiên của công đoàn (Source). Công đoàn của bạn được định nghĩa là ["long", "null"] do đó giá trị mặc định phải là số dài. null không phải là số dài, đó là lý do bạn gặp lỗi.

Nếu bạn vẫn muốn xác định null làm giá trị mặc định, sau đó đặt giản đồ rỗng trước, tức là thay đổi công đoàn thành ["null", "long"] thay thế.

+7

Đơn giản chỉ cần đặt null đầu tiên trong loại công đoàn không làm cho nó tùy chọn có vẻ như - đó là cách tôi đã có nó và vẫn có lỗi. Thêm null mặc định là cần thiết ít nhất là trên Avro 1.7.5 mà tôi đang sử dụng. –

+2

https://avro.apache.org/docs/1.7.7/spec.html#Unions không đề cập đến điều này. –

3

Số lỗi tại đầu Avro được đánh dấu là Not A Problem. Bạn cần thêm thuộc tính mặc định để đề cập đến giá trị mặc định.

{"name": "xxx", "type": ["null", "boolean"], "default": null} 

Vui lòng tham khảo AVRO-1803.

+0

Đối với giá trị số, giá trị mặc định phải là null nhưng khi một loại chuỗi phải là "null" - nghĩa là "default": null} và "default": "null"} – JamesC

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