avro的逻辑类型可用于验证输入数据吗?

时间:2017-05-09 11:11:12

标签: java serialization deserialization avro

我试图理解如何使用avro的逻辑类型。 首先让我举一个关于我想要实现的目标的例子;我想编写一个新的逻辑类型( RegExLogicalType )来验证输入字符串并接受它或引发一些异常。

或者让我们谈谈现有支持的avro逻辑类型之一(十进制)我期望以这种方式使用它:

  1. 如果指定了无效的十进制逻辑类型,则必须引发异常;类似于预期的必填字段但没有提供任何内容org.apache.avro.AvroRuntimeException: Field test_decimal type:BYTES pos:2 not set and has no default value
  2. 如果指定了有效的十进制逻辑类型,则不应引发异常。
  3. 我在文档中发现的只是关于阅读/反序列化而且我不知道写/序列化的内容

      

    语言实现必须忽略未知的逻辑类型   阅读,并应使用底层的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的逻辑类型是否可用于验证输入数据?或者还有其他东西可用于验证输入数据?

0 个答案:

没有答案