12

私はApache Avroを使用しています。

私のスキーマにはマップタイプがあります:

{"name": "MyData", 
  "type" :  {"type": "map", 
              "values":{
                   "type": "record",
                   "name": "Person",
                   "fields":[
                      {"name": "name", "type": "string"},
                      {"name": "age", "type": "int"},

                ]
                }
               }
}

スキーマをコンパイルした後、生成CharSequenceされたJavaクラス はMap MyData.

CharSequenceinをキーとして使用するのは非常に不便です。Apache Avroでタイプ キーMapを生成する方法はありますか?StringMap

PS

問題は、たとえば、そこにそのようなキーがあるにもかかわらず、それが であるという理由だけで がdataMap.containsKey("SOME_KEY")返されることです。また、既存のキーを使用してマップ エントリを配置しても、古いキーは置き換えられません。だから鍵として使うのは不便だと言っているのです。falseCharSequenceCharSequence

4

6 に答える 6

11

この JIRA ディスカッションは関連しています。現在も使用されている CharSequence の要点は、後方互換性です。

また、Charles Forsythe が指摘したように、スキーマで string プロパティを設定することにより、String が必要な場合の回避策が追加されました。

 { "type": "string", "avro.java.string": "String" }

ここでのデフォルトのタイプは、独自の Utf8 クラスです。手動の指定とpom.xml 設定に加えて、avro-tools コンパイル オプション、-stringオプションもあります。

java -jar avro-tools.1.7.5.jar compile -string schema /path/to/schema .
于 2013-11-08T21:36:13.460 に答える
8

どうやら、Avro 1.6 にはこの問題の回避策があるようです。プロジェクトの POM ファイルで文字列型を指定します。

  <stringType>String</stringType>

これは、この問題で言及されているAVRO-803です ... ただし、プラグインの Web ドキュメントにはこれが反映されていません。

于 2013-11-01T15:04:28.177 に答える
5

どうやら、デフォルトで Avro は を使用しますCharSequenceに変換するように構成する方法を見つけましたString

Avro 1.6.0 以降では、Avro に常に文字列への変換を実行させるオプションがあります。これを実現するには、いくつかの方法があります。1 つ目は、スキーマの avro.java.string プロパティを String に設定することです。

         { "type": "string", "avro.java.string": "String" }

私はこれをテストしていません。

于 2013-11-01T15:02:06.707 に答える