当前位置: 首页 > 面试题库 >

Avro字段默认值

巴帅
2023-03-14
问题内容

我在设置Avro字段的默认值时遇到了一些问题。我有一个简单的架构,如下所示:

data.avsc:

{
 "namespace":"test",
 "type":"record",
 "name":"Data",
 "fields":[
    { "name": "id", "type": [ "long", "null" ] },
    { "name": "value", "type": [ "string", "null" ] },
    { "name": "raw", "type": [ "bytes", "null" ] }
 ]
}

我正在使用 avro-maven-plugin v1.7.6 生成Java模型。

当我使用:创建模型的实例时 Data data = Data.newBuilder().build();,它会失败并出现以下异常:

org.apache.avro.AvroRuntimeException:org.apache.avro.AvroRuntimeException:字段ID类型:UNION
pos:0未设置,并且没有默认值。

但是,如果我指定“默认”属性,

{ "name": "id", "type": [ "long", "null" ], "default": "null" },

我没有得到这个错误。我在文档中读到,联合中的第一个架构成为默认架构。所以我的问题是,为什么我仍然需要指定“默认”属性?我还如何使字段可选?

而且,如果我确实需要指定默认值,那么它如何适用于联合;我需要为联合中的每个架构指定默认值,以及如何按照顺序/语法进行工作?

谢谢。


问题答案:

联合的默认值对应于联合的第一个架构(Source)。为此,您定义了并集["long", "null"],默认值必须是长整数。null不是很长的数字,这就是为什么您会收到错误消息。

如果您仍想定义null为默认值,则将空模式放在第一位,即将并集["null", "long"]改为。



 类似资料:
  • 我在设置Avro字段的默认值时遇到了一些问题。我有一个简单的模式,如下所示: 数据avsc: 我使用的是avro maven插件v1。7.6生成Java模型。 当我使用:创建模型的实例时,它会失败,但有一个异常: org.apache.avro.AvroRuntimeExc0019:org.apache.avro.AvroRuntimeExc0019:字段id类型: UNION pos: 0未设置

  • 我正在尝试序列化一个avro模式,然后将其写入hortonworks模式注册表,但在写入操作期间收到以下错误消息。 这是avro模式 无论谁,如果我添加“null”作为联合的第一种类型,都会成功。avro联合类型需要“null”吗?在我的情况下,这将是不正确的数据表示,所以我不热衷于这样做。如果有什么不同,我使用avro 1.9.1。 此外,如果标签不正确,但找不到标签并且没有足够的代表来创建新标

  • avro.version= 在avro模式中,map type不支持缺省值。我尝试了以下不同的模式。 第一: 第二: 第三: Java代码如下: 我只希望constraintQuantities和RawQuanties为null。因为这些是可选字段。即使我没有将它们设置为null,它也会抛出异常。 最重要的是,方法生成java POJO,但无法构建该对象。 如果不设置它们为空,然后接收以下异常:

  • 问题内容: 我正在使用以下方法在ES中创建动态映射: 因此,每当我为具有字段()的文档建立索引时,它都会自动创建具有类型的字段()。因此,每当没有a时,我都会发送一个空字符串,然后引发异常。 有什么办法可以解决这个问题?我可以指定默认值吗? 问题答案: 您可以添加到所有字段,也可以全局设置: 仅字段: 全局设置 :

  • 我不明白为什么我应用程序会删除异常“字段'ID_Employeer'没有默认值”。 是我的主键,当我试图将任何信息保存到我的数据库时,我得到了这个异常,但是,当我只是试图从DB读取信息时,它是正常的。 我读了关于StackOverflow的主题,但我仍然不明白我应用程序中的答案。我正在使用Hibernate5.2.11。 我的: 我的冬眠: 下一个CharacterInfo类 主类 最后例外

  • 所以我有一个这样的avro记录(称之为v1): 我想添加一个区分大小写的字段,默认值为false(称为v2)。我的第一种方法是: 根据模式演变,这是向后和向前兼容的,因为具有新模式的读取器读取用旧写入器模式编码的记录将能够填充此字段默认值和具有旧模式的读取器将能够读取用新写入器模式编码的记录,因为它只会忽略新添加的字段。 添加此字段的另一种方法是添加默认值为null的