2012-02-23 6 views
10

オプションの配列を持つことができるかどうかは疑問です。 のは、このようなスキーマを想定してみましょう:「simple_array」なしアブロレコードを書き込もうとしましたavroスキーマのオプション配列

{ 
    "type": "record", 
    "name": "test_avro", 
    "fields" : [ 
     {"name": "test_field_1", "type": "long"}, 
     {"name": "subrecord", "type": [{ 
     "type": "record", 
     "name": "subrecord_type", 
      "fields":[{"name":"field_1", "type":"long"}] 
      },"null"] 
    }, 
    {"name": "simple_array", 
    "type":{ 
     "type": "array", 
     "items": "string" 
     } 
    } 
    ] 
} 

はdatafilewriterでNPEことになります。サブレコードの場合 はそれだけで大丈夫ですが、私は、オプションとして配列を定義しようとすると:

{"name": "simple_array", 
"type":[{ 
    "type": "array", 
    "items": "string" 
    }, "null"] 

これは、NPEが、実行時例外にはなりません。

AvroRuntimeException: Not an array schema: [{"type":"array","items":"string"},"null"] 

感謝。

答えて

17

私はあなたがここに欲しいことはヌルと配列の労働組合と思う:私は、Pythonのサンプルデータと上記のスキーマを使用する場合は、ここでの結果は(schema_stringは、上記のJSON文字列である)

{ 
    "type":"record", 
    "name":"test_avro", 
    "fields":[{ 
      "name":"test_field_1", 
      "type":"long" 
     }, 
     { 
      "name":"subrecord", 
      "type":[{ 
        "type":"record", 
        "name":"subrecord_type", 
        "fields":[{ 
          "name":"field_1", 
          "type":"long" 
         } 
        ] 
       }, 
       "null" 
      ] 
     }, 
     { 
      "name":"simple_array", 
      "type":["null", 
       { 
        "type":"array", 
        "items":"string" 
       } 
      ], 
      "default":null 
     } 
    ] 
} 

です:

>>> from avro import io, datafile, schema 
>>> from json import dumps 
>>> 
>>> sample_data = {'test_field_1':12L} 
>>> rec_schema = schema.parse(schema_string) 
>>> rec_writer = io.DatumWriter(rec_schema) 
>>> rec_reader = io.DatumReader() 
>>> 
>>> # write avro file 
... df_writer = datafile.DataFileWriter(open("/tmp/foo", 'wb'), rec_writer, writers_schema=rec_schema) 
>>> df_writer.append(sample_data) 
>>> df_writer.close() 
>>> 
>>> # read avro file 
... df_reader = datafile.DataFileReader(open('/tmp/foo', 'rb'), rec_reader) 
>>> print dumps(df_reader.next()) 
{"simple_array": null, "test_field_1": 12, "subrecord": null} 
+0

Javaリストで同じ問題が発生した場合、あなたの答えは私の問題を解決しました。ありがとう! – forhas

+0

同じエラーが発生します。私のセットアップでは、MapReduce Javaプログラムを使用してAvroファイルを処理しようとしています。仕事は成功しました。データパイプラインの次の段階は、変換されたデータ上にハイブテーブル(avroSerde)を作成することです。このテーブルも正常に作成されますが、hqlを使用してテーブルをクエリしようとすると(つまり、mapreduceジョブが実行されます) 「エラー:java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException:ハイライン・ランタイム・エラーが書き込み可能な " – venBigData

関連する問題