1

使用 amazon deequ 库,我正在尝试构建一个函数,该函数需要 3 个参数、检查对象、一个告诉需要运行什么约束的字符串以及另一个提供约束条件的字符串。我有一堆要从 mysql 表中读取的检查。我的意图是遍历我从 mysql 表中获得的所有检查,并使用我上面描述的函数构建一个检查对象并在源数据帧上运行检查这里是亚马逊 deequ 的示例 https://towardsdatascience.com/使用 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))                                                          
4

1 回答 1

0

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

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

if (constraint == "hasSize") {
  // as Constraint
  Constraint.sizeConstraint(_ <= 10)
  // as Check
  Check(CheckLevel.Error, "name").hasSize(_ <= 10)
}
于 2020-04-06T09:35:27.143 回答