我写了一个Avro架构,其中一些字段**需要** String
类型,但Avro已经生成了CharSequence
类型的字段。
我无法找到任何方法告诉Avro制作String
类型的字段。
我尝试使用
"fields": [
{
"name":"startTime",
"type":"string",
"avro.java.stringImpl":"String"
},
{
"name":"endTime",
"type":"string",
"avro.java.string":"String"
}
]
但是对于这两个字段,Avro正在生成CharSequence
类型的字段。
还有其他方法可以制作String
类型的字段吗?
答案 0 :(得分:30)
如果您希望所有字符串字段都是java.lang.String
的实例,那么您只需配置编译器:
java -jar /path/to/avro-tools-1.7.7.jar compile -string schema
或者如果您使用的是Maven插件
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.7.7</version>
<configuration>
<stringType>String</stringType>
</configuration>
[...]
</plugin>
如果你想要一个特定的字段是java.lang.String类型那么......你不能。编译器不支持它。你可以使用&#34; java-class&#34;使用reflect API但编译器并不关心。
如果您想了解更多信息,可以在SpecificCompiler第372行Avro 1.7.7中设置断点。您可以在调用addStringType()
之前看到架构在props
字段中包含所需信息。如果您将此架构传递给SpecificCompiler.javaType()
,那么它将执行您想要的操作。但后来addStringType
用静态替换了你的模式。我很可能会在邮件列表上提出这个问题,因为我不明白这一点。
答案 1 :(得分:6)
您可以按字段级别设置它,只需将类型更改为对象,并包含&#34; type&#34; :&#34; string&#34;和#34; avro.java.string&#34; :&#34;字符串&#34;
见下文例如:
{
"type": "record",
"name": "test",
"fields": [
{
"name": "name",
"type": {
"type": "string",
"avro.java.string": "String"
}
}
]
}