我是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
我可以在架构中指定任何内容来截断它吗?
这是一个可能的开始。 特定基准读取器包含以下转换逻辑。 这取决于您生成的类来覆盖转换方法。 架构编译器需要具有挂钩来注入转换对象。我一直在寻找钩子。
@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);
}