2012-04-16 5 views
5

AVRO에 대한 새로운 소식입니다. 분명한 사항이 빠진 경우 변명하십시오. AVRO 스키마에 대한 입력의 유효성을 검사하는 AVRO 유효성 검사기/명령 줄 유틸리티가 있습니까? 또는 json 입력에서 오류가 발생한 지점을 가리킬 수도 있습니다.AVRO 유효성 확인

답변

4

나는 알고 있습니다. json 파일이 스키마와 일치하는지 알려주는이 작은 파이썬 스크립트를 작성했지만, 사용자에게 알려주지 않습니다. 오류가있는 경우 오류가 발생합니다.

Python avro library에 따라 다릅니다.

#!/usr/bin/env python 

from avro.io import validate 
from avro.schema import parse 
from json import loads 
from sys import argv 

def main(argv): 
    valid = set() 
    invalid_avro = set() 
    invalid_json = set() 

    if len(argv) < 3: 
     print "Give me an avro schema file and a whitespace-separated list of json files to validate against it." 
    else: 
     schema = parse(open(argv[1]).read()) 
     for arg in argv[2:]: 
      try: 
       json = loads(open(arg, 'r').read()) 
       if validate(schema, json): 
        valid.add(arg) 
       else: 
        invalid_avro.add(arg) 
      except ValueError: 
       invalid_json.add(arg) 
    print ' Valid files:\n\t' + '\n\t'.join(valid) 
    print 'Invalid avro:\n\t' + '\n\t'.join(invalid_avro) 
    print 'Invalid json:\n\t' + '\n\t'.join(invalid_json) 

if '__main__' == __name__: 
    main(argv) 
+0

스크립트를 이용해 주셔서 감사합니다. 실제 문제를 지적하는 것은 아무것도 없다는 사실은 도청입니다. – airboss

+0

@Anup 스키마와 입력을 청크로 분해하고 그 청크의 유효성을 검사해야합니다. RecordSchema를 깨는 것은 쉽지만 JSON 입력이 유효하지 않은 경우이를 깨뜨리는 방법을 알기가 어렵습니다. 의견이 있으면 알려주세요. – kojiro

1

Avro 스키마를 Avro 데이터를 처리 할 때 Avro 스키마가 필수적이므로 항상 기본적으로 기본적으로 유효성을 검사합니다. 달리 말하자면, Avro를 파싱하는 것은 필연적으로 그것을 검증 할 것입니다.

Avro 데이터에 메타 데이터가 거의 없다는 점을 감안하면 호환되지 않는 모든 변경 사항은 본질적으로 데이터 손상입니다. 그리고 너는 그냥 쓰레기를 얻을지도 모른다. 필드 ID 나 구분 기호가 없기 때문에 모든 데이터는 스키마에서 따라야하는 것을 기반으로 해석됩니다. 이러한 중복성 부족은 데이터를 매우 작게 만들지 만, 심지어 가장 작은 데이터 손상으로도 전체 데이터 스트림을 쓸모 없게 만들 수 있음을 의미합니다.

+0

나는 당신이 말하는 것을 얻습니다. 그러나 Avro 예외 (스키마와 입력 불일치의 경우)는 모호하며 입력의 실제 문제를 정확하게 지적하지 않습니다. 아마, 더 사용자 친화적 인 무언가를 찾고있을 것입니다. – airboss

+0

아, 예, 이해했습니다. avro 팀에 대한 개선을 제안 할 수도 있지만 기본 파서를 사용하는 것이 좋습니다. 나는 오류가 그다지 유용하지 않은 경향이 있다는 점에 동의한다 : - / – StaxMan

1

JSON에서 실행할 수있는 JavaScript 용 Avro 유효성 검사기를 만들었습니다. Avro 릴리스의 일부는 아니지만 곧 커밋해야합니다. 패치는 https://issues.apache.org/jira/browse/AVRO-485에서 찾을 수 있습니다.