2012-04-16 10 views
5

Bin ziemlich neu bei AVRO, also bitte entschuldigen Sie, wenn etwas offensichtlich fehlt. Gibt es ein AVRO Validator/Kommandozeilenprogramm, das Eingaben gegen ein AVRO Schema validiert? Oder zeigt wahrscheinlich auf, wo der Fehler in der JSON-Eingabe ist.AVRO Validation

Antwort

4

Nicht dass ich mir dessen bewusst bin. Ich schrieb dieses kleine Python-Skript, das Ihnen sagen wird, ob eine JSON-Datei mit einem Schema übereinstimmt, aber es wird Ihnen nicht sagen wo der Fehler ist, wenn es einen gibt.

Es hängt von der Python avro library ab.

#!/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

Danke für das Skript ... werde es ausprobieren. Aber die Tatsache, dass es nichts gibt, das auf das eigentliche Problem verweist, ist Bugging. – airboss

+0

@Anup Sie müssten das Schema und die Eingabe in Chunks zerlegen und diese Chunks validieren. Ein RecordSchema zu zerlegen ist einfach genug, aber wenn die JSON-Eingabe ungültig ist, ist es schwer zu wissen, wie man es bricht. Wenn Sie irgendwelche Vorschläge haben, lassen Sie es mich wissen. – kojiro

1

Ich bin nicht Ihre Frage stellt sicher Sinn: da Avro Schema Verbindlich ist, wenn Avro Datenverarbeitung, ist es immer grundsätzlich standardmäßig validiert. Mit anderen Worten, die Analyse von Avro wird es notwendigerweise bestätigen.

Leider gibt es nur sehr wenige Metadaten in Avro-Daten. Alle inkompatiblen Änderungen sind im Wesentlichen Datenkorruption; und Sie können einfach nur Müll bekommen. Dies liegt daran, dass keine Feld-IDs oder Trennzeichen vorhanden sind: Alle Daten werden basierend darauf interpretiert, was Schema sagt, muss folgen. Dieser Mangel an Redundanz macht Daten sehr kompakt, bedeutet aber auch, dass selbst kleinste Datenbeschädigungen den gesamten Datenstrom nutzlos machen können.

+0

Ich verstehe, was Sie sagen. Aber die Avro-Ausnahmen (im Falle einer Inkongruenz mit dem Schema) sind vage und zeigen nicht genau auf das tatsächliche Problem in der Eingabe. Wahrscheinlich, auf der Suche nach etwas benutzerfreundlicher. – airboss

+0

Ah, ja, verstanden. Obwohl Sie wahrscheinlich Verbesserungen an Avro-Team, als Standard-Parser vorschlagen könnten. Ich stimme darin überein, dass Fehler in der Regel nicht so nützlich sind ...: - / – StaxMan

1

Ich habe einen Avro-Validator für JavaScript, die Sie auf JSON ausführen können. Es ist noch nicht Teil einer Avro-Version, sollte aber bald veröffentlicht werden. Sie finden den Patch unter https://issues.apache.org/jira/browse/AVRO-485.