【问题标题】:AVRO ValidationAVRO 验证
【发布时间】:2012-04-16 23:24:13
【问题描述】:

我对 AVRO 还很陌生,所以如果遗漏了任何明显的东西,请原谅。 是否有根据 AVRO 模式验证输入的 AVRO 验证器/命令行实用程序?或者可能指向错误在 json 输入中的位置。

【问题讨论】:

    标签: json encoding validation avro


    【解决方案1】:

    我不知道。我写了这个小 Python 脚本,它会告诉你一个 json 文件是否与一个模式匹配,但它不会告诉你 哪里 错误是否存在。

    这取决于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)
    

    【讨论】:

    • 感谢您的脚本...会试一试。但事实上没有任何迹象表明实际问题是错误的。
    • @Anup 您必须将模式和输入分解为块并验证这些块。分解 RecordSchema 很容易,但如果 JSON 输入无效,则很难知道如何分解它。如果您有任何建议,请告诉我。
    【解决方案2】:

    我不确定您的问题是否有意义:由于在处理 Avro 数据时 Avro Schema 是强制性的,因此默认情况下它基本上总是经过验证。换句话说,解析 Avro 的行为必然会验证它。

    不幸的是,鉴于 Avro 数据中的元数据非常少,所有不兼容的更改本质上都是数据损坏;你很可能会得到垃圾。这是因为没有字段 ID 或分隔符:所有数据都根据 Schema 所说的必须遵循的内容进行解释。这种冗余的缺乏使数据非常紧凑,但也意味着即使是最小的数据损坏也可能使整个数据流无用。

    【讨论】:

    • 我明白你在说什么。但是 Avro 异常(在输入与模式不匹配的情况下)是模糊的,并不完全指向输入中的实际问题。可能,正在寻找对用户更友好的东西。
    • 啊,是的,明白了。尽管您可能会建议对 avro 团队进行改进,但使用默认解析器。我同意错误往往没有那么有用...:-/
    【解决方案3】:

    我为 JavaScript 制作了一个 Avro 验证器,可以在 JSON 上运行。它还不是 Avro 版本的一部分,但应该很快就会提交。你可以在https://issues.apache.org/jira/browse/AVRO-485找到补丁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 2018-10-17
      • 2019-07-12
      • 1970-01-01
      • 2022-12-20
      • 2020-02-23
      • 2023-03-14
      相关资源
      最近更新 更多