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

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用静态替换你的模式.我很可能会在邮件列表上问这个问题,因为我没有看到这一点.

  • 有这方面的一些文档吗?我正在寻找如何指定数组类型。我希望它是 Set 而不是 `java.util.list`,但找不到任何文档:/ (2认同)

小智 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)