如何使用Avro生成String类型的字段而不是CharSequence?

时间:2014-08-04 12:28:52

标签: 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"
    }
]

但是对于这两个字段,Avro正在生成CharSequence类型的字段。

还有其他方法可以制作String类型的字段吗?

2 个答案:

答案 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"
            }
        }
    ]
}