2012-02-23 22 views
10

में वैकल्पिक सरणी मैं सोच रहा हूं कि वैकल्पिक सरणी होना संभव है या नहीं। के इस तरह एक स्कीमा मान लेते हैं:एवरो स्कीमा

{ 
    "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 में एक एनपीई में परिणाम होगा बिना एक एवरो रिकॉर्ड लिखने के लिए कोशिश कर रहा है। subrecord के लिए यह ठीक है, लेकिन जब मैं वैकल्पिक के रूप में सरणी परिभाषित करने की कोशिश:

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

यह एक एनपीई लेकिन एक क्रम अपवाद में परिणाम नहीं करता है:

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

धन्यवाद।

उत्तर

17

मुझे लगता है कि क्या तुम यहाँ चाहते का एक संघ है बातिल और सरणी:

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

जब मैं अजगर में नमूना डेटा के साथ ऊपर स्कीमा का उपयोग करें, यहाँ परिणाम (schema_string ऊपर json स्ट्रिंग है):

>>> 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

जावा सूचियों के साथ एक ही समस्या थी, तो आपके उत्तर ने मेरी समस्या हल कर दी है। धन्यवाद! – forhas

+0

मुझे एक ही त्रुटि मिलती है। मेरे सेटअप में मैं MapReduce Java प्रोग्राम का उपयोग कर एवरो फ़ाइल को संसाधित करने की कोशिश कर रहा हूं। नौकरी सफलतापूर्वक थी। डेटापिपलाइन का अगला चरण ट्रांसफॉर्म किए गए डेटा पर एक हाइव टेबल (avroSerde) बनाना है, तालिका भी सफलतापूर्वक बनाई जाती है लेकिन जब मैं hql का उपयोग कर तालिका से पूछताछ करने का प्रयास करता हूं, (जिसने बदले में मैप्रिडस जॉब निष्पादित किया), तो नौकरी विफल हो जाती है "त्रुटि: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: लिखने योग्य प्रसंस्करण करते समय हाइव रनटाइम त्रुटि" – venBigData