Avro Schema字段名含非法字符(点)的解决方法咨询
解决Avro Schema字段名包含点(
.)的问题 Avro的字段命名规则确实不允许直接使用点(.),因为这个字符在Avro语法里是用来访问嵌套字段的分隔符,所以直接定义foo.webpage.url作为字段名会触发SchemaParseException。不过有两种靠谱的方案可以满足你的需求:
方案1:使用字段别名(Aliases)
如果foo.webpage.url只是一个单纯的字段名(不表示嵌套层级),你可以给字段设置一个合法的主名称,同时添加别名保留原带点的名称。Avro的别名机制支持在数据读写时映射这些名称,大部分Avro工具和客户端库都能兼容这种方式。
示例Schema:
{ "type": "record", "name": "YourRecord", "fields": [ { "name": "foo_webpage_url", // 合法的主字段名 "type": "string", "aliases": ["foo.webpage.url"] // 保留原带点的名称作为别名 } ] }
这样定义后,你既可以通过foo_webpage_url访问字段,也可以使用别名foo.webpage.url来引用它,完美兼顾合法性和原名称需求。
方案2:改用嵌套Record结构
如果foo.webpage.url本来就表示层级关系(比如foo下的webpage下的url),那更符合Avro设计理念的做法是把它拆成嵌套的Record类型。这样不仅合法,还能更好地体现数据的结构语义。
示例Schema:
{ "type": "record", "name": "YourRecord", "fields": [ { "name": "foo", "type": { "type": "record", "name": "Foo", "fields": [ { "name": "webpage", "type": { "type": "record", "name": "Webpage", "fields": [ { "name": "url", "type": "string" } ] } } ] } } ] }
此时你可以通过foo.webpage.url的语法访问这个字段,和你原本想要的名称访问方式完全一致,而且完全符合Avro的语法规范。
需要注意的是:Avro并不支持通过转义字符(比如\)来保留字段名里的点,所以这种方式是不可行的,建议优先从上面两种方案里选择适合你的场景。
内容的提问来源于stack exchange,提问作者HamidOvic
相关产品推荐
相关产品推荐

