2012-02-23 41 views
10

İsteğe bağlı bir dizinin mümkün olup olmadığını merak ediyorum. en bir şema böyle varsayalım:avro şemada isteğe bağlı dizi

{ 
    "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" 
     } 
    } 
    ] 
} 

"simple_array" datafilewriter bir NPE neden olacaktır olmadan bir avro rekor yazmaya çalışıyorum. subrecord için gayet güzel, ama ben isteğe bağlı olarak diziyi tanımlamak çalıştığınızda:

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

Bir NPE ama çalışma zamanı istisnası yol açmaz:

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

teşekkürler.

cevap

17

ben burada ne istiyorsan birliği olduğunu düşünüyorum boş ve dizi:

{ 
    "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 
     } 
    ] 
} 

Python içinde örnek verilerle yukarıdaki şema kullandığınızda, burada sonuç (schema_string yukarıdaki json dizesi) var:

>>> 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 listeleri ile aynı sorun, cevap sorunumu çözdü vardı. Teşekkürler! – forhas

+0

Aynı hatayı alıyorum. Kursumda MapReduce Java programını kullanarak bir Avro dosyasını işlemeye çalışıyorum. İş başarıyla geçti. Veri yolunun bir sonraki aşaması, dönüştürülmüş veriler üzerinde bir kovan tablosu (avroSerde) oluşturmaktır. Tablo da başarıyla oluşturulmaktadır, ancak tabloyu hql kullanarak sorgulamaya çalıştığımda (bu da bir mapreduce İşi yürütmektedir), iş başarısız olur. "Hata: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException ile: yazılabilir işlenirken Hive Runtime Error" – venBigData