Преобразование данных для поля с использованием 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);
  }
Другие вопросы по тегам