Преобразование данных для поля с использованием 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
Есть ли что-то, что я могу указать в схеме для усечения?
1 ответ
Это возможное начало. SpecificDatumReader содержит следующую логику преобразования. Это зависит от вашего сгенерированного класса, чтобы переопределить метод преобразования. Компилятор схемы должен иметь хуки для внедрения объекта преобразования. Я искал крючок.
@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);
}