2017-05-05 144 views
0

我正在使用apache avro並希望從我的模式中獲取邏輯類型。我嘗試使用函數getLogicalType(),但它返回null。我不明白什麼是錯的。我的模式如下。apache avro api的getLogicalType()函數即使存在也會返回null

{ 
    "namespace": "example.avro", 
    "type": "record", 
    "name": "User", 
    "fields": [ 
     {"name": "name", "type": "string"}, 
     {"name": "favorite_number", "type": "int", "logicalType": "decimal", "precision": 2, "scale": "2"}, 
     {"name": "favorite_color", "type": ["string", "null"]} 
    ] 
} 

以下是我在哪裏訪問logicalType

for(Schema.Field currField : schema.getFields()) { 

     field = createFieldList(currField.name(), currField.schema().getType().toString(), currField.schema().getLogicalType()); 
     fields.add(field); 
    } 
+0

正如我在評論中寫道,以我的回答你有爲所有字段循環,並且只爲第二個字段定義* logicalType *,這就是爲什麼getLogicalType()返回null,至少對於第一個和第三個字段。嘗試僅爲每個字段輸出getLogicalType的結果,而不是在createFieldList()中使用它。 – LLL

+0

不,它打印全部爲空 – Hazzard

回答

0

夥計們,我想我找到了答案。邏輯類型被聲明的方式是錯誤的。取而代之的

{ 
    "name": "favorite_number", 
    "type": "int", 
    "logicalType": "decimal", 
    "precision": 2, 
    "scale": "2" 
}, 

應該

{ 
    "name": "favorite_number", 
    "type": { 
    "type": "int", 
    "logicalType": "decimal", 
    "precision": 2, 
    "scale": "2" 
    } 
}, 

現在,當我使用getlogicalType()函數,它給了我預期的結果

+0

如果這是解決方案,那麼我認爲你應該得到SchemaParseException,因爲你寫了你沒有得到它,我認爲這可能是一個錯誤。無論如何,它很適合你。 – LLL

+1

順便說一句,您可以通過使用函數getObjectProps()在第一個實例中訪問logicalType。它返回一個地圖,您可以從中訪問一個字段的所有屬性。至於它是否應該拋出異常,我真的不知道它是否應該。謝謝你的幫助。 – Hazzard

0

您需要使用解析方法將設置logicalType heresetLogicalType將初始化here的代碼。我沒有經歷過這個圖書館,但基於代碼我沒有看到其他方式。

然後這個變量將由getLogicalType返回您正在使用的方法。

+0

我使用瞭解析方法。然後我試圖訪問這些字段並嘗試獲取邏輯類型。但它返回null。 currField.schema()。getLogicalType()。這裏currField的類型是Field – Hazzard

+0

您是否抓住並忽略了例如SchemaParseException? – LLL

+0

Err。爲什麼會拋出這個例外。上面的模式被解析。 – Hazzard

相關問題