2012-04-16 6 views
5

Sono abbastanza nuovo per AVRO quindi scusami se mi manca qualcosa di ovvio. Esiste un programma di convalida/utility AVRO che convalida l'input con uno schema AVRO? O probabilmente indica dove si trova l'errore nell'input di JSON.Convalida AVRO

risposta

4

Non che io sia a conoscenza. Ho scritto questo piccolo script python che ti dirà se un file JSON corrisponde a uno schema, ma non ti dirà dove l'errore è se ce n'è uno.

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

Grazie per lo script ... lo proverò. Ma il fatto che non ci sia nulla che rimandi al problema attuale è il bugging. – airboss

+0

@Anup Dovresti abbattere lo schema e l'input in blocchi e convalidare quei blocchi. Spezzare un RecordSchema è abbastanza facile, ma se l'input JSON non è valido, è difficile sapere come suddividerlo. Se hai qualche suggerimento, fammi sapere. – kojiro

1

Non sono sicuro che la tua domanda ha un senso: dal Avro Schema è OBBLIGATORIO durante l'elaborazione dei dati Avro, è sempre sostanzialmente convalidato per impostazione predefinita. In altre parole, l'atto di analizzare Avro lo confermerà per necessità.

Sfortunatamente, dato che ci sono pochissimi metadati nei dati Avro, tutte le modifiche incompatibili saranno essenzialmente corruzione dei dati; e potresti anche solo prendere spazzatura. Questo perché non ci sono ID di campo o separatori: tutti i dati vengono interpretati in base a ciò che lo Schema dice che deve seguire. Questa mancanza di ridondanza rende i dati molto compatti, ma significa anche che anche il più piccolo danneggiamento dei dati può rendere inutilizzabile l'intero flusso di dati.

+0

Ottengo quello che stai dicendo. Ma le eccezioni Avro (in caso di mancata corrispondenza degli input con lo schema) sono vaghe e non puntano esattamente al problema reale nell'input. Probabilmente, alla ricerca di qualcosa di più facile da usare. – airboss

+0

Ah, sì, capito. Sebbene tu possa probabilmente suggerire miglioramenti al team di avro, pars parser predefinito. Sono d'accordo sul fatto che gli errori tendono a non essere così utili ...: - / – StaxMan

1

Ho creato un validatore Avro per JavaScript che è possibile eseguire su JSON. Non fa ancora parte di una versione di Avro, ma dovrebbe essere presto commesso. È possibile trovare la patch a https://issues.apache.org/jira/browse/AVRO-485.