我试图理解如何使用avro的逻辑类型。 首先让我举一个关于我想要实现的目标的例子;我想编写一个新的逻辑类型( RegExLogicalType )来验证输入字符串并接受它或引发一些异常。
或者让我们谈谈现有支持的avro逻辑类型之一(十进制)我期望以这种方式使用它:
org.apache.avro.AvroRuntimeException: Field test_decimal type:BYTES pos:2 not set and has no default value
我在文档中发现的只是关于阅读/反序列化而且我不知道写/序列化的内容
语言实现必须忽略未知的逻辑类型 阅读,并应使用底层的Avro类型。如果是逻辑类型 无效,例如小于其精度的小数, 那么实现应该忽略逻辑类型并使用 潜在的Avro类型。
我不希望序列化/反序列化的上述行为我需要具有与用于根据模式验证数据的XSD限制(模式)等效的东西
如果架构如下,则在avro中
{"namespace": "com.stackoverflow.avro",
"type": "record",
"name": "Request",
"fields": [
{"name": "caller_jwt", "type": "string", "logicalType": "regular-expression", "pattern": "[a-zA-Z0-9]*\\.[a-zA-Z0-9]*\\.[a-zA-Z0-9]*"},
{"name": "test_decimal", "type": "bytes", "logicalType": "decimal", "precision": 4, "scale": 2}
]
}
如果我尝试构建一个对象并将其序列化为:
DatumWriter<Request> userDatumWriter = new SpecificDatumWriter<>(Request.class);
DataFileWriter<Request> dataFileWriter = new DataFileWriter<>(userDatumWriter);
ByteBuffer badDecimal = ByteBuffer.wrap("bad".getBytes());
Request request = Request.newBuilder()
.setTestDecimal(badDecimal) // bad decimal
.setCallerJwt("qsdsqdqsd").build(); // bad value according to regEx
dataFileWriter.create(request.getSchema(), new File("users.avro"));
dataFileWriter.append(dcCreationRequest);
dataFileWriter.close();
不抛出任何异常,并将对象序列化为users.avro文件
所以我不知道avro的逻辑类型是否可用于验证输入数据?或者还有其他东西可用于验证输入数据?