2017-02-09 9 views
0

Я новичок в AVRO. Мы начали использовать схему AVRO для чтения данных.Преобразование данных для поля с использованием AVRO

Теперь у нас есть прецедент, где мне нужно обрезать данные во время чтения.

Пусть мой Avro schcema, как это

{ 
    "name": "table", 
    "namepsace": "csd", 
    "type": "record", 
    "fields": [ 
     {"name": "CustId", "type":"string"}, 
     {"name": "ProductId", "type":"string"}, 
     {"time": "time", "type":"long"} 
    ] 
} 

Теперь данные, как это.

{ 
    "CustId" : "abc1234" 
    "ProductID" : "ABC1234567" 
    "time" : 123456789 
} 

Когда я прочитал данные, я хочу усечь поле ProductID. В приведенном выше примере, когда я читаю ProductID, который является ABC1234567, я хочу усечь его до 5 символов ABC12

Есть ли что-нибудь, что я могу указать в схеме, чтобы усечь его?

ответ

0

Это возможный старт. SpecificDatumReader содержит следующую логику преобразования. Это зависит от вашего сгенерированного класса, чтобы переопределить метод преобразования. Компилятор Schema должен будет иметь крючки для ввода объекта преобразования. Я искал крючок.

@Override 
protected void readField(Object r, Schema.Field f, Object oldDatum, 
         ResolvingDecoder in, Object state) 
    throws IOException { 
if (r instanceof SpecificRecordBase) { 
    Conversion<?> conversion = ((SpecificRecordBase)).getConversion(f.pos()); 

    Object datum; 
    if (conversion != null) { 
    datum = readWithConversion(
     oldDatum, f.schema(), f.schema().getLogicalType(), conversion, in); 
    } else { 
    datum = readWithoutConversion(oldDatum, f.schema(), in); 
    }