2012-04-16 32 views
5

Soy bastante nuevo en AVRO, por favor disculpe si me falta algo obvio. ¿Existe una utilidad de validador/línea de comandos AVRO que valide la entrada en un esquema AVRO? O probablemente apunta a dónde está el error en la entrada json.Validación de AVRO

Respuesta

4

No es que yo sepa. Escribí este pequeño script de python que le dirá si un archivo json coincide con un esquema, pero no le dirá donde es el error si hay alguno.

Depende del 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

Gracias por el guión ... lo probaré. Pero el hecho de que no haya nada que apunte al problema real es molestar. – airboss

+0

@Anup Tendría que dividir el esquema y la entrada en fragmentos y validar esos fragmentos. Romper un RecordSchema es bastante fácil, pero si la entrada JSON no es válida, es difícil saber cómo dividirla. Si tiene alguna sugerencia, hágamelo saber. – kojiro

1

No estoy seguro de que su pregunta tiene sentido: desde Avro esquema es obligatorio cuando el tratamiento de datos Avro, siempre es básicamente validado por defecto. Dicho de otra manera, el acto de analizar Avro necesariamente lo validará.

Desafortunadamente, dado que hay muy pocos metadatos en los datos de Avro, todos los cambios incompatibles serán esencialmente datos corruptos; y es muy posible que solo consigas basura. Esto porque no hay identificadores de campo o separadores: todos los datos se interpretan en función de lo que Schema dice que debe seguir. Esta falta de redundancia hace que los datos sean muy compactos, pero también significa que incluso la corrupción de datos más pequeña puede hacer que todo el flujo de datos sea inútil.

+0

entiendo lo que dices. Pero las excepciones Avro (en caso de desajuste de entrada con el esquema) son vagas y no apuntan exactamente al problema real en la entrada. Probablemente, buscando algo más amigable para el usuario. – airboss

+0

Ah, sí, entendido. Aunque probablemente podrías sugerir mejoras al equipo avro, analizador predeterminado wrt. Estoy de acuerdo en que los errores tienden a ser menos útiles ...: - / – StaxMan

Cuestiones relacionadas