使用 AVRO 对字段进行数据转换



我是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);
  }

相关内容

  • 没有找到相关文章

最新更新