2012-02-23 32 views
10

Tôi tự hỏi có thể có mảng tùy chọn hay không. Giả sử một sơ đồ như thế này:mảng tùy chọn trong lược đồ 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" 
     } 
    } 
    ] 
} 

Đang cố gắng để viết một bản ghi Avro không có "simple_array" sẽ cho kết quả trong một NPE trong datafilewriter. Đối subrecord nó chỉ là tốt, nhưng khi tôi cố gắng để xác định các mảng như tùy chọn:

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

Nó không dẫn đến một NPE nhưng một ngoại lệ thời gian chạy:

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

Cảm ơn.

Trả lời

17

Tôi nghĩ rằng những gì bạn muốn ở đây là một sự kết hợp của vô mảng:

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

Khi tôi sử dụng sơ đồ trên với dữ liệu mẫu trong Python, đây là kết quả (schema_string là chuỗi json trên):

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

Có cùng vấn đề với danh sách java, câu trả lời của bạn đã giải quyết được sự cố của tôi. Cảm ơn! – forhas

+0

Tôi gặp lỗi tương tự. Trong thiết lập của tôi, tôi đang cố gắng xử lý tệp Avro bằng chương trình Java MapReduce. Công việc đã thành công. Giai đoạn tiếp theo của datapipeline là tạo một bảng hive (avroSerde) trên dữ liệu được chuyển đổi, Bảng cũng được tạo thành công nhưng khi tôi cố gắng truy vấn bảng bằng cách sử dụng hql, (lần lượt thực hiện một công việc Mapreduce), công việc thất bại với "Lỗi: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Lỗi Runtime Hive khi xử lý có thể ghi" – venBigData

Các vấn đề liên quan