2016-05-23 1 views
2

У меня есть общая запись, как показано ниже, где holder - это карта со значениями в виде строки.Как извлечь карту, напечатанную из GenericRecord в Avro?

{ 
    "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 использует utf8 класс для строкового представления внутри. Другое решение было бы изменить схему, чтобы поддержать представление Java String, в Avro:

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

С этой схемы можно использовать HashMap<String,String>, чтобы получить держателя карты. См. Apache Avro: map uses CharSequence as key для получения дополнительных инструкций.