2012-04-16 8 views
5

AVROにはかなり新しくなっています。 AVROスキーマに対する入力を検証するAVROバリデータ/コマンドラインユーティリティはありますか?または、おそらく、エラーがjson入力のどこにあるのかを指します。AVROバリデーション

答えて

4

私は認識していません。私はjsonファイルがスキーマにマッチするかどうかを教えてくれる小さなPythonスクリプトを書いたが、それはを教えてくれない。エラーがあればそれがある。

これは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データにはメタデータがほとんどないため、すべての互換性のない変更は基本的にデータの破損になります。あなたはたまにゴミを手に入れるかもしれません。フィールドIDまたは区切り記号がないため、すべてのデータはスキーマに従わなければならないことに基づいて解釈されます。この冗長性の欠如は、データを非常にコンパクトにしますが、最小のデータ破損によってもデータストリーム全体が役に立たなくなる可能性があります。

+0

私はあなたが言っていることを得る。しかし、Avroの例外(スキーマとの入力ミスマッチの場合)はあいまいであり、入力の実際の問題を正確に指し示すものではありません。たぶん、ユーザーフレンドリーなものを探しています。 – airboss

+0

ああ、ええ、分かりました。あなたはおそらくavroチーム、wrtのデフォルトのパーサーへの改善を提案することができますが。私は間違いがそれほど有用でない傾向があることに同意します...: - / – StaxMan

1

JSONで実行できるJavaScript用のAvroバリデーターを作成しました。それはまだAvroリリースの一部ではありませんが、すぐにコミットする必要があります。パッチはhttps://issues.apache.org/jira/browse/AVRO-485にあります。