【问题标题】:building a function to add checks to amazon deequ framework构建一个函数来向 amazon deequ 框架添加检查
【发布时间】:2020-03-17 18:01:24
【问题描述】:

使用 amazon deequ 库,我正在尝试构建一个函数,该函数需要 3 个参数、检查对象、一个告诉需要运行什么约束的字符串以及另一个提供约束条件的字符串。我有一堆要从 mysql 表中读取的检查。我的意图是遍历我从 mysql 表中获得的所有检查,并使用我上面描述的函数构建一个检查对象,并在源数据帧上运行检查 这是亚马逊deequ的一个例子 https://towardsdatascience.com/automated-data-quality-testing-at-scale-using-apache-spark-93bb1e2c5cd0

所以函数调用看起来像这样,

var _check = build_check_object_function(check_object, "hasSize", "10000")

这个函数应该向 check_object 添加一个新的 hasSize 检查并返回它。

我卡住的部分是如何将 hasSize 字符串转换为 hasSize 函数。

    var _check = Check(CheckLevel.Error, "Data Validation Check")
    val listOfFunctions= _check.getClass.getMethods.filter(!_.getName().contains('$'))
    for (function <- listOfFunctions) {
       if( function.getName().toLowerCase().contains(row(2).asInstanceOf[String].toLowerCase())) {
         _check = _check.function(row(3))
        }else{
            println("Not a match")}
        }

这是我得到的错误

<console>:38: error: value function is not a member of com.amazon.deequ.checks.Check
   if( function.getName().toLowerCase().contains(row(2).asInstanceOf[String].toLowerCase())) {_check = _check.function(row(3))                                                          

【问题讨论】:

    标签: scala apache-spark methods amazon-deequ


    【解决方案1】:

    您可以使用运行时反射或在您的数据库和 deequ 声明之间构建一个精简的翻译层。

    我建议您将数据库约束/检查字符串显式转换为 deequ 声明,例如:

    if (constraint == "hasSize") {
      // as Constraint
      Constraint.sizeConstraint(_ <= 10)
      // as Check
      Check(CheckLevel.Error, "name").hasSize(_ <= 10)
    }
    

    【讨论】:

    • 是的......但是这样......如果 deequ 库中有新规则......我必须回到我的代码并将其添加到我的代码中
    • 另一种选择是将实际的deequ源代码存储在表中并使用Scala编译器进行编译。有关示例,请参见此答案。 stackoverflow.com/questions/58453541/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多