构建一个向amazondeequ框架添加检查的函数



使用amazon deequ库,我试图构建一个函数,该函数包含3个参数,即check对象、一个告诉需要运行什么约束的字符串和另一个提供约束条件的字符串。我有一堆检查,我想从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))                                                          

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

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

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

最新更新