2012-02-23 2 views
10

선택적 배열을 사용할 수 있는지 궁금합니다. 의 스키마과 같이 가정 해 봅시다 :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" 
     } 
    } 
    ] 
} 

는 "simple_array"는 datafilewriter에서 NPE가 발생할 것없이 브로 기록을 작성하려고합니다. subrecord를 들어 는 그냥 괜찮지 만 내가 선택으로 배열을 정의 할 때 :

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

그것은 NPE하지만 런타임 예외가 발생하지 않습니다

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

감사합니다.

답변

17

나는 당신이 여기에 원하는 것은의 조합이라고 생각 널 (null) 및 배열 :

{ 
    "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 프로그램을 사용하여 Avro 파일을 처리하려고합니다. 작업이 성공적으로 완료되었습니다. 데이터 파이프 라인의 다음 단계는 변환 된 데이터 위에 하이브 테이블 (avroSerde)을 만드는 것입니다. 테이블도 성공적으로 생성되지만 hql (테이블 맵 작업을 실행)을 사용하여 테이블을 쿼리하려고하면 작업이 실패합니다 "오류 : java.lang.RuntimeException : org.apache.hadoop.hive.ql.metadata.HiveException : 하이버 런타임 오류가 발생하여 쓰기 가능한" – venBigData