web-dev-qa-db-ja.com

Avroを使用してCharSequenceの代わりにString型のフィールドを生成するにはどうすればよいですか?

いくつかのフィールドが**タイプStringである必要がある** 1つのAvroスキーマを作成しましたが、AvroはタイプCharSequenceのフィールドを生成しました。

タイプStringのフィールドを作成するようにAvroに指示する方法を見つけることができません。

使ってみました

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

ただし、両方のフィールドについて、AvroはタイプCharSequenceのフィールドを生成しています。

タイプStringのフィールドを作成する他の方法はありますか?

20
Shekhar

すべての文字列フィールドを_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>        
_

1つの特定のフィールドをJava.lang.String型にしたい場合は、できません。コンパイラではサポートされていません。リフレクトAPIで「Javaクラス」を使用できますが、コンパイラは気にしません。

詳細を知りたい場合は、SpecificCompilerの372行目のAvro1.7.7にブレークポイントを設定できます。 addStringType()を呼び出す前に、スキーマのpropsフィールドに必要な情報があることがわかります。このスキーマをSpecificCompiler.javaType()に渡すと、必要な処理が実行されます。ただし、addStringTypeはスキーマを静的スキーマに置き換えます。要点がわからないので、メーリングリストで質問する可能性が高いです。

34

フィールドレベルごとに設定し、タイプをオブジェクトに変更して、「type」:「string」と「avro.Java.string」:「String」を含めることができます。

たとえば、以下を参照してください。

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