2012-04-16 19 views
5

Jestem całkiem nowy dla AVRO, więc proszę wybacz, jeśli brakuje mi czegoś oczywistego. Czy istnieje narzędzie AVRO do sprawdzania poprawności/wiersza poleceń, które sprawdza poprawność danych wejściowych w stosunku do schematu AVRO? Lub prawdopodobnie wskazuje, gdzie błąd znajduje się na wejściu json.AVRO Validation

Odpowiedz

4

Nie jestem tego świadomy. Napisałem ten mały skrypt Pythona, który powie ci, czy plik json pasuje do schematu, ale nie powie ci, gdzie błąd jest, jeśli jest.

To zależy od 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

Dzięki za scenariusz ... wypróbuje to. Ale fakt, że nie ma niczego, co wskazuje na faktyczny problem, to bugging. – airboss

+0

@Anup Trzeba by rozbić schemat i dane wejściowe na porcje i sprawdzić poprawność tych fragmentów. Łamanie RecordSchema jest łatwe, ale jeśli wejście JSON jest nieprawidłowe, trudno jest się dowiedzieć, jak je zlikwidować. Jeśli masz jakieś sugestie, daj mi znać. – kojiro

1

nie jestem pewien sens pytanie: skoro Avro Schema jest obowiązkowe przy przetwarzaniu danych Avro, jest zawsze w zasadzie potwierdzone domyślnie. Inaczej mówiąc, akt parsowania Avro będzie z konieczności go potwierdzał.

Niestety, biorąc pod uwagę, że w danych Avro jest bardzo mało metadanych, wszystkie niezgodne zmiany będą zasadniczo uszkodzeniem danych; i możesz po prostu dostać śmieci. Dzieje się tak, ponieważ nie ma identyfikatorów pól ani separatorów: wszystkie dane są interpretowane na podstawie tego, co musi być napisane w schemacie. Ten brak nadmiarowości powoduje, że dane są bardzo kompaktowe, ale oznacza to również, że nawet najmniejsze uszkodzenie danych może sprawić, że cały strumień danych stanie się bezużyteczny.

+0

Dostaję to, co mówisz. Ale wyjątki Avro (w przypadku niedopasowania wejścia ze schematem) są niejasne i nie wskazują dokładnie na faktyczny problem na wejściu. Prawdopodobnie szukasz czegoś bardziej przyjaznego dla użytkownika. – airboss

+0

Ach, tak, zrozumiano. Chociaż prawdopodobnie mógłbyś zaproponować ulepszenia do zespołu avro, użyj domyślnego parsera. Zgadzam się, że błędy nie są aż tak przydatne ...: - / – StaxMan