2016-05-23 74 views
2

我有一個通用記錄,如下所示,其中holder是一個值爲字符串的映射。如何從Avro中的GenericRecord中提取Map類型?

{ 
    "name" : "holder", 
    "type" : { 
     "type" : "map", 
     "values" : "string" 
    } 
    } 

及以下的持有人地圖數據:

"holder": { 
    "cossn": "0", 
    "itwrqm": "20003" 
} 

而且我想在一個地圖和字符串的提取持有人的數據。我不確定我該怎麼做?我嘗試了兩種選項,如下圖所示:

這回對象:

GenericRecord record = decoder.decode(data.value());  
Object holder = record.get("holder"); 

這會返回地圖,但我實在不明白這是地圖鍵和值。

GenericRecord record = decoder.decode(data.value());  
Map<String, String> holder = (Map<String, String>) record.get("holder"); 

當我打印holder我看到這樣,這顯然不是一個鍵/值的地圖。我在做什麼錯?以及如何提取從GenericRecord類型的地圖?

{cossn=0, itwrqm=200006033213} 

回答

2

嘗試使用

HashMap<Utf8, Utf8> holder = (HashMap<Utf8, Utf8>) record.get("holder"); 

,並通過

String itwrqm = holder.get(new Utf8("itwrqm")).toString(); 

訪問您持有項目的Avro使用UTF-8班字符串表示的內部。 另一個解決辦法是改變你的架構,以支持Avro公司在Java String表示:

{ 
"name" : "holder", 
"type" : "type": {"type": "map", "values": {"type" : "string","avro.java.string": "String"}, 
     "avro.java.string":"String"} 
} 

與該Schema您可以使用HashMap<String,String>,讓您的持有者地圖。 有關詳細說明,請參閱Apache Avro: map uses CharSequence as key

相關問題