Avro字段名称,以数字/整数开头

时间:2018-12-07 07:06:10

标签: java scala avro

我想创建一个Avro模式,该模式的列名称为123或342等。 我试图用数字名称(用“`”括起来)创建模式,如下所示:

 val dataTypeMap = Map(
                    "int"-> Type.INT,
                    "long"->Type.LONG,
                    "java.lang.Double" -> Type.DOUBLE,
                    "java.lang.Boolean" -> Type.BOOLEAN,
                    "java.lang.String"-> Type.STRING
                  )
  val schemaBuilder: SchemaBuilder.FieldAssembler[Schema] = SchemaBuilder.record("test").fields()

  import org.apache.avro.Schema
  import org.apache.avro.SchemaBuilder

  val schema: SchemaBuilder.FieldAssembler[Schema] = SchemaBuilder.record("Telemetry").fields

  val map = Map("`1`"-> 1,"`2`"->true, "`3`"-> 2l,"`4`"->3.0d, "`5`"->"hello")
  val newSchema = map.foldLeft(schema)((x,y)=>{       

x.name(y._1)。type(Schema.create(dataTypeMap(y._2.getClass.getCanonicalName)))。noDefault()       })。endRecord()

但失败,并显示以下错误消息:

Exception in thread "main" org.apache.avro.SchemaParseException: Illegal initial character: 1
        at org.apache.avro.Schema.validateName(Schema.java:1147)
        at org.apache.avro.Schema.access$200(Schema.java:81)
        at org.apache.avro.Schema$Field.<init>(Schema.java:403)
        at org.apache.avro.SchemaBuilder$FieldBuilder.completeField(SchemaBuilder.java:2124)
        at org.apache.avro.SchemaBuilder$FieldBuilder.completeField(SchemaBuilder.java:2120)
        at org.apache.avro.SchemaBuilder$FieldBuilder.access$5200(SchemaBuilder.java:2034)
        at org.apache.avro.SchemaBuilder$GenericDefault.noDefault(SchemaBuilder.java:2417)

请帮助 在此先感谢

1 个答案:

答案 0 :(得分:1)

我认为这可以回答您的问题。您应该使用字母作为前缀。 我是从以下链接中获得的:https://issues.apache.org/jira/browse/AVRO-153

记录,字段和枚举名称必须:

  • 以[A-Za-z_]开头
  • 随后仅包含[A-Za-z0-9 _]

但是,我们什么都没说名称空间。我建议名称空间必须是一系列如上定义的点分隔标识符。

关于鼓励使用的命名约定,我会选择Java:

命名空间是分层的,其根在左侧,以反向域名开头。

  • 命名空间元素是小写记录,枚举名称是
  • 大写的CamelCase字段和消息名称不大写
  • camelCase枚举符号是全大写首字母缩写,名称中带有
  • 大写,例如Md5Hash,BaseUrl等