有没有办法在avdl文件中定义类似数字的枚举

时间:2019-11-11 15:29:17

标签: java avro

我知道

定义的“普通” avro枚举
enum ActionType {CREATE, REMOVE}
.pdl文件中的

或通过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"}}
  1. 是否可以在avdl文件中写入这样的枚举(我更喜欢使用avro-maven-plugin)?

1 个答案:

答案 0 :(得分:0)

  1. 否,很遗憾,这不是有效的Avro模式。规范指出,符号的第一个字符必须为a-z或下划线。注意有关符号与正则表达式匹配的部分。
  

symbols:一个JSON数组,以JSON字符串形式列出符号(必填)。枚举中的所有符号都必须是唯一的;禁止重复。每个符号都必须与正则表达式[A-Za-z_][A-Za-z0-9_]*相匹配(与名称的要求相同)。

https://avro.apache.org/docs/current/spec.html#Enums

  1. 由于#1的答案为否,#2的答案为否,因此您无法定义一个以数字开头的有效枚举。

您可能需要考虑一种将原始值“ 01”,“ 02”与Avro枚举符号“ VALUE_01”,“ VALUE_02”进行转换的转换层。那将必须在您的应用程序代码中定义。它不是Avro提供的功能。另外,您可以像建议的那样将其定义为string。这可能是最快的解决方案,但没有像枚举那样显式定义和限制可能的值。