2014-04-08 139 views
21

我遇到了一些問題,爲avro字段設置默認值。我有一個簡單的模式,如下所示: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" ] } 
] 
} 

我使用的Avro-Maven的插件v1.7.6生成Java模型。

當我創建使用

Data data = Data.newBuilder().build();模型的實例時,出現異常org.apache.avro.AvroRuntimeException:org.apache.avro.AvroRuntimeException:域ID類型:UNION POS:0未設定並沒有默認值。

但是,如果我指定的「默認」屬性,

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

我沒有得到這個錯誤。我在文檔中讀到聯合中的第一個模式成爲默認模式。所以我的問題是,爲什麼我仍然需要指定「默認」屬性?我還有什麼可以讓字段可選?

如果我確實需要指定默認值,那麼對於聯合如何工作;我是否需要爲聯合中的每個模式指定默認值,以及它們在順序/語法方面如何工作?

謝謝。

回答

30

聯合的默認值對應於接頭(Source)的第一模式。您的工會被定義爲["long", "null"]因此,默認值必須是一個很長的數字。 null不是一個很長的數字,這就是爲什麼你得到一個錯誤。

如果您仍然想要將null定義爲默認值,請首先放置空模式,即將聯合更改爲["null", "long"]

+7

簡單地把null放在類型union中看起來並不是可選的 - 這就是我如何使用它,並且仍然有錯誤。至少在我使用的Avro 1.7.5上需要添加默認空值。 –

+2

https://avro.apache.org/docs/1.7.7/spec.html#Unions確實提到了這一點。 –

3

它的一個錯誤在Avro的末端,它被標記爲Not A Problem。 您需要添加默認屬性來提及默認值。

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

請參考AVRO-1803

+0

對於數字值,默認值必須爲空,但是當字符串類型時,它必須是「null」 - 即「default」:null}和「default」:「null」} – JamesC