我想创建一个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)
请帮助 在此先感谢
答案 0 :(得分:1)
我认为这可以回答您的问题。您应该使用字母作为前缀。 我是从以下链接中获得的:https://issues.apache.org/jira/browse/AVRO-153
记录,字段和枚举名称必须:
但是,我们什么都没说名称空间。我建议名称空间必须是一系列如上定义的点分隔标识符。
关于鼓励使用的命名约定,我会选择Java:
命名空间是分层的,其根在左侧,以反向域名开头。