当前位置: 首页 > 知识库问答 >
问题:

如何在 Java 中使用 UNION 类型的 avro 模式验证记录值

蒋华美
2023-03-14

我正在根据avro模式验证记录数据。以下是具有联合类型的模式:

{
   "type":"record",
   "name":"event",
   "namespace":"test",
   "fields":[
      {
         "name":"email",
         "type":[
            "null",
            {
               "type":"string",
               "avro.java.string":"String"
            }
         ]
      }
   ]
}

我的记录是:

{
   "emailAddress":"test@gmail.com"
}

现在,我想验证此特定字段是否具有正确的类型。以下是我的 Java 代码

// Schema
Schema dataSchema = schema.getField("data").schema();
// Converting my record into map
Map<String, Object> kafkaEvent = CustomRuleUtils.jsonStringToMap((String) kafkaEventData);
// Checking each field of schema (type and value) against this map
for (Schema.Field field : dataSchema.getFields()) {
    // if record has that field (emailAddress)
    if (kafkaEvent.get(field.name()) != null) {
        // want to check type of this record is correct or not ("test@gmail.com" is type of schema
        // HOW TO DO IT ????
        kafkaEvent.get(field.name()).getClass();
        field.schema().getTypes();
    } else {
        // invalid
    }
}

如何检查该值是否属于模式中定义的类型之一。

共有1个答案

章誉
2023-03-14

您应该尝试一些Avro序列化程序,例如Confluent库,用您的模式序列化负载。如果库无法使用模式序列化/验证有效负载,它将引发异常。

 类似资料:
  • 问题内容: 我正在尝试让Python解析如下的Avro模式… …并且出现以下异常: 我究竟做错了什么? 问题答案: 根据网络上的其他消息来源,我将重写您的第二个地址定义:

  • 根据Avro模式规范(适用于接头):https://avro.apache.org/docs/current/spec.html 如上所述,Unions使用JSON数组表示。例如,["null","string"]声明一个模式,该模式可以是null或string。 ( 请注意,当为类型为联合的记录字段指定默认值时,默认值的类型必须与联合的第一个元素匹配。 因此,对于包含“null”的联合,通常首先

  • 我正在尝试使用以下方法在运行时获取Avro模式: 但由于我的POJO类包含以下泛型: 我得到以下例外情况: 我知道Avro不会支持泛型类型。是否有一种方法可以在运行时生成架构时从类中省略某些类字段?

  • 我有一个JSON对象,其中一部分如下: 这里,坐标作为Object的数组发送。现在,对于这个JSON对象,我想创建avro模式(. avsc文件),到目前为止,如下所示: 但是,对于当前模式,我得到以下错误: 执行生成目标org.apache.avro:avro-maven-plugin:1.8.1:模式失败:未定义的名称:"对象" 如果有人能帮忙,我如何指定是否在avro架构中键入? 谢谢。

  • 我从http://json-schema.org/draft-07/schema中注意到,它支持if then else语句根据值切换验证模式,但我不知道如何实现它们。

  • 大家好,我需要为下面的示例创建AVRO模式; 当我按照建议更改所有者对象时,avro-tool返回错误。 ]} 测试: