She*_*har 18 java apache serialization avro
我编写了一个Avro架构,其中一些字段**需要**类型,String但Avro已经生成了那些类型的字段CharSequence.
我无法找到任何方法告诉Avro制作那些类型的字段String.
我试着用
"fields": [
{
"name":"startTime",
"type":"string",
"avro.java.stringImpl":"String"
},
{
"name":"endTime",
"type":"string",
"avro.java.string":"String"
}
]
Run Code Online (Sandbox Code Playgroud)
但对于这两个领域,Avro正在生成类型的字段CharSequence.
有没有其他方法来制作这些类型的字段String?
Clé*_*IEU 38
如果您希望所有字符串字段都是实例,java.lang.String那么您只需配置编译器:
java -jar /path/to/avro-tools-1.7.7.jar compile -string schema
Run Code Online (Sandbox Code Playgroud)
或者如果您使用的是Maven插件
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.7.7</version>
<configuration>
<stringType>String</stringType>
</configuration>
[...]
</plugin>
Run Code Online (Sandbox Code Playgroud)
如果你想要一个特定的字段是java.lang.String类型那么......你不能.编译器不支持它.您可以将"java-class"与反射API一起使用,但编译器并不关心.
如果您想了解更多信息,可以在SpecificCompiler第372行Avro 1.7.7中设置断点.您可以在调用addStringType()架构之前看到该props字段中包含所需信息.如果您将此架构传递给SpecificCompiler.javaType()它,它将执行您想要的操作.但是后来addStringType用静态替换你的模式.我很可能会在邮件列表上问这个问题,因为我没有看到这一点.
小智 8
您可以按字段级别设置它,只需将类型更改为对象,并包含"type":"string"和"avro.java.string":"String"
见下面的例子:
{
"type": "record",
"name": "test",
"fields": [
{
"name": "name",
"type": {
"type": "string",
"avro.java.string": "String"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)