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

2022-09-01 09:24:50

我写了一个Avro模式,其中一些字段**需要是**类型的,但Avro已经生成了这些类型的字段。StringCharSequence

我无法找到任何方法来告诉Avro制作这些类型的字段。String

我尝试使用

"fields": [
    {
        "name":"startTime",
        "type":"string",
        "avro.java.stringImpl":"String"
    },
    {
        "name":"endTime",
        "type":"string",
        "avro.java.string":"String"
    }
]

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

有没有其他方法可以使这些字段的类型?String


答案 1

如果您希望所有字符串字段都是的实例,则只需配置编译器: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,那么...你不能。编译器不支持它。您可以将“java-class”与反射API一起使用,但编译器并不关心。

如果您想了解更多信息,可以在 SpecificCompiler 第 372 行 Avro 1.7.7 中设置断点。您可以看到,在调用架构之前,字段中有所需的信息。如果将此架构传递给,则它将执行所需的操作。但随后会将架构替换为静态架构。我很可能会在邮件列表上提出这个问题,因为我没有看到这一点。addStringType()propsSpecificCompiler.javaType()addStringType


答案 2

您可以按字段级别进行设置,只需将类型更改为对象,并包括“type”:“string”和“avro.java.string”:“String”

例如,请参阅以下内容:

{
    "type": "record",
    "name": "test",
    "fields": [
        {
            "name": "name",
            "type": {
                "type": "string",
                "avro.java.string": "String"
            }
        }
    ]
}