【问题标题】:How to specify a default value for an enum using avro IDL?如何使用 avro IDL 为枚举指定默认值?
【发布时间】:2013-07-25 03:45:39
【问题描述】:

我在文档中没有找到任何关于此的内容,只有关于默认值的通用 bla。我的假设是它应该像这样工作:

enum MyEnum {
   UNSPECIFIED,
   SPECIFIED
}

record Test {
   MyEnum e = "UNSPECIFIED";
}

不幸的是,Java 中的 GenericDatumReader 抱怨说他正在寻找一个字符串,但需要一个 MyEnum。

任何人都可以确认这是使用 avro IDL 使用具有默认值的枚举的正确方法吗?在那种情况下,我在其他地方有一个错误。 谁能确认这不是这样做的方法并纠正我? 任何意见表示赞赏!

更新: 在我的真实世界版本中,似乎新添加到记录的枚举导致了问题,即使它具有默认值。这意味着我的阅读器架构需要一个枚举,而记录不包含一个。模式演化应该能够解决这个问题,但似乎失败了。 更多细节:我在这里使用 Pig,而不是直接使用 Java。

【问题讨论】:

    标签: java enums idl avro


    【解决方案1】:

    好的,事实证明这确实是为 avro IDL 中的枚举指定默认值的正确方法。在我的情况下,联合 {null, string} 已被枚举替换,导致所有麻烦。所以请记住:不要更改 avro 中字段的类型

    【讨论】:

    • 小心,顺序很重要。枚举需要在协议中的记录之前定义。如果在上面的示例中反转 MyEnum 和 Test,则不考虑默认值。
    【解决方案2】:

    我不知道 avro IDL,但如果你确定 'record' 语法,你可以使用此代码将你的 String 转换为你的枚举类型

    MyEnum e = Enum.valueOf(MyEnum.class, "UNSPECIFIED")
    

    【讨论】:

    • 感谢您的回答,但这对我来说是没有选择的,因为我依赖于 avro 模式演变(现在新添加的枚举似乎失败了)。
    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2020-12-26
    • 2011-10-27
    相关资源
    最近更新 更多