JAVA脚本用于执行JAVA脚本检查数据:可按需定义执行条件与逻辑,调用系统 API 处理复杂业务场景,灵活满足内置规则无法覆盖的自定义数据质量检查需求。
复杂业务场景用内置规则无法准确检查,为准确检查数据质量,使用JAVA语言编写代码精准找到需要质检的数据进行检查。
脚本代码:需要执行的Java代码,支持行数据检查、整表数据检查这2种检查方式
行数据检查:
#传统jdbc引擎示例 import com.esen.eutil.util.StrFunc; class CheckData { /** *校验表格行数据中E32字段是否为非空有效值 *@return boolean 校验结果:true=E32字段非空有效,false=E32字段为空/无效 */ public boolean checkRowData(TableRowData rowData) { String value = rowData.getFieldValue("E32"); return !StrFunc.isNull(value); } }
#Spark引擎示例 package com.esen.edq.spark; import java.io.Serializable; import org.apache.spark.sql.Row; import com.esen.edq.spark.core.rule.script.TableRowData; import com.esen.eutil.util.StrFunc; class CheckRow implements Serializable { /** *校验表格行数据中E32字段是否为非空有效值 *@return boolean 校验结果:true=E32字段非空有效,false=E32字段为空/无效 */ private static final long serialVersionUID = -8046849565053039741L; public boolean checkRowData(Row row, TableRowData rowData) { String value = row.getAs(rowData.getFieldAlias("E32")); return !StrFunc.isNull(value); } } |
TableRowData接口方法说明如下:
方法 | 描述 |
getPeriod() | 获取此行数据的数据期; |
getDataClass() | 获取此行的数据级次; |
getFieldAlias(String fieldName) | 取此行数据某字段的别名; |
getFieldValue(String fieldName) | 取此行数据某字段的值; |
getLinkFieldValue(String linkId ,String fieldName) | linkId代表关 |
整表数据检查:
#传统jdbc引擎示例 import com.esen.eutil.util.StrFunc; class CheckTableData { private CheckResultData resultData = new CheckResultDataImpl(); //记录男生数量 int man = 0; //记录女生数量 int woman = 0; public void batchCheckTableData(TableDataSet tableDataSet,TableResultSetMgr resultSetMgr){ while(tableDataSet.next()) { TableRowData tableRowData = tableDataSet.getTableRowData(); String fieldValue = (String) tableRowData.getFieldValue("sex_"); if("男".equals(fieldValue)) { man++; }else if("女".equals(fieldValue)){ woman++; } if(man == 0 || woman == 0){ resultData.addTableResult("person",false,null); }else{ resultData.addTableResult("person",0.4<man/woman<0.6,null); } } } public CheckResultData finishBatchCheck(){ return null; } public CheckResultData finishFinalCheck(){ return resultData; } } #Spark引擎示例 package com.esen.edq.spark; import java.io.Serializable; import org.apache.spark.sql.Row; import com.esen.edq.spark.core.rule.script.TableRowData; import com.esen.eutil.util.StrFunc; Class CheckTableData implements Serializable { private CheckResultData resultData = new CheckResultDataImpl(); //记录男生数量 int man = 0; //记录女生数量 int woman = 0; public void batchCheckTableData(TableDataSet tableDataSet,TableResultSetMgr resultSetMgr){ while(tableDataSet.next()) { TableRowData tableRowData = tableDataSet.getTableRowData(); String fieldValue = (String) tableRowData.getFieldValue("sex_"); if("男".equals(fieldValue)) { man++; }else if("女".equals(fieldValue)){ woman++; } if(man == 0 || woman == 0){ resultData.addTableResult("person",false,null); }else{ resultData.addTableResult("person",0.4<man/woman<0.6,null); } } } public CheckResultData finishBatchCheck(){ return null; } public CheckResultData finishFinalCheck(){ return resultData; } }
|
TableDataSet接口方法说明如下:
方法 | 描述 |
next() | 下一条数据,没有下一条返回false,有则返回true; |
getTableRowData() | 返回当前指向的TableRowData接口,TableRowData接口说明如上; |
resultSetMgr接口方法说明如下:
方法 | 描述 |
getResultSet(String tableName,String orderFields,String whereSql) | 获得一个当前连接池检查表ResultSet对象; |
getResultSet(String ds,String tableName,String orderFields,String whereSql) | 获得一个其他连接池表的ResultSet对象; |
refreshResultSet(String ds,String tableName,String orderFields,String whereSql) | 重新获得一个检查表ResultSet对象,ds可为空; |
CheckResultData接口方法说明如下:
方法 | 描述 |
addRowResult(TableRowData rowData,boolean passed,String desc) | 添加一条以行数据做检查的检查结果; |
addTableResult(String desc,boolean passed) | 添加一条以整表数据做检查的检查结果; |
请先登录