我知道由
定义的“正常”avro 枚举enum ActionType {CREATE, REMOVE}
在.avdl 文件中 或者通过 avro 模式中的这种类型的构造:
{ "type": "enum",
"name": "ActionType",
"symbols" : ["CREATE", "REMOVE"]
}
问题是我的特定实体将具有可以具有值的字段 “01”和“02”。
所以我的问题是: 1. 这是正确的 avro 枚举定义吗
{ "type": "enum",
"name": "MyType",
"symbols" : ["01", "02"]
}
否则我必须选择简单
{"name":"id","type":{"type":"string","avro.java.string":"String"}}
- 有没有办法在avdl文件中编写这样的枚举(我更喜欢使用avro-maven-plugin)?
最佳答案
- 不,不幸的是,这不是有效的 Avro 架构。该规范规定符号的第一个字符必须是 a-z 或下划线。请注意有关与正则表达式匹配的符号的部分。
symbols: a JSON array, listing symbols, as JSON strings (required). All symbols in an enum must be unique; duplicates are prohibited. Every symbol must match the regular expression
[A-Za-z_][A-Za-z0-9_]*
(the same requirement as for names).
https://avro.apache.org/docs/current/spec.html#Enums
- 由于问题 1 的答案是否定的,因此问题 2 的答案是否定的,因此您无法定义其中符号以数字开头的有效枚举。
您可能需要考虑一种将原始值“01”、“02”转换为 Avro 枚举符号“VALUE_01”、“VALUE_02”的转换层。这必须在您的应用程序代码中定义。它不是 Avro 提供的功能。或者,您可以像您建议的那样将其定义为 string
。这可能是最快的解决方案,但没有像枚举那样明确定义和限制可能的值。
关于java - 有没有办法在 avdl 文件中定义类似数字的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58804262/