Преобразование данных для поля с помощью AVRO

Я новичок в АВРО. Мы начали использовать схему AVRO для чтения данных.

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

Предположим, моя авро схема такая

{
    "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.

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


person user7538424    schedule 09.02.2017    source источник


Ответы (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);
  }
person Foo Bar    schedule 04.05.2017