/ / Перетворення даних для поля з використанням AVRO - avro, spark-avro, avro-tools, avro4s

Перетворення даних для поля за допомогою AVRO - avro, spark-avro, avro-tools, avro4s

Я новачок у 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

Чи є якась річ, яку я можу вказати у схемі, щоб обрізати її?

Відповіді:

0 для відповіді № 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);
}