教程 | Datavines 自定义数据质量检查规则(Metric)

打印 上一主题 下一主题

主题 682|帖子 682|积分 2046

Metric 是 Datavines 中一个核心概念,一个 Metric 表示一个数据质量检查规则,比如空值检查和表行数检查都是一个规则。Metric 采用插件化设计,用户可以根据自己的需求来实现一个 Metric。下面我们来详细讲解一下如何自定义Metric。
第一步

我们先了解下几个接口和抽象类,它们是实现自定义 Metric 的关键。
SqlMetric 接口

SqlMetric接口中定义了规则的各种属性和操作的接口。
  1. @SPI
  2. public interface SqlMetric {
  3.     // 中文名
  4.     String getName();
  5.     // 英文名
  6.     String getZhName();
  7.     // 根据系统的语言进行名字返回
  8.     default String getNameByLanguage(boolean isEn) {
  9.         return isEn ? getName() : getZhName();
  10.     }
  11.     // 规则属于哪个维度,比如准确性、唯一性等等
  12.     MetricDimension getDimension();
  13.     // 规则的类型,包括单表检查、单表自定义检查
  14.     MetricType getType();
  15.     // 规则的级别,比如表级别、列级别
  16.     default MetricLevel getLevel() {
  17.         return MetricLevel.NONE;
  18.     }
  19.     // 是否支持错误数据输出
  20.     boolean isInvalidateItemsCanOutput();
  21.     /**
  22.      * 获取不符合规则的数据的SQL语句
  23.      * @return ExecuteSql
  24.      */
  25.     ExecuteSql getInvalidateItems(String uniqueKey);
  26.     /**
  27.      * 计算实际值的SQL语句
  28.      * @return ExecuteSql
  29.      */
  30.     ExecuteSql getActualValue(String uniqueKey);
  31.     /**
  32.      * 实际值的字段名
  33.      */
  34.     default String getActualName() {
  35.         return "actual_value";
  36.     }
  37.     // 实际值的类型,比如数字,百分比或者列表
  38.     default String getActualValueType() {
  39.         return MetricActualValueType.COUNT.getDescription();
  40.     }
  41.     // 对参数进行检查并输出检查结果
  42.     CheckResult validateConfig(Map<String,Object> config);
  43.     //规则所需要的参数
  44.     Map<String, ConfigItem> getConfigMap();
  45.     //构造规则前需要做的检查
  46.     void prepare(Map<String,String> config);
  47.     default String getIssue() {
  48.         return "";
  49.     }
  50.     // 适合哪些字段类型
  51.     List<DataVinesDataType> suitableType();
  52.     // 是否支持多选,比如表行数检查支持多张表
  53.     default boolean supportMultiple() {
  54.         return false;
  55.     }
  56.     // 对规则参数的重新构造,配合表行数多张表检查
  57.     default List<Map<String,Object>> getMetricParameter(Map<String,Object> metricParameter) {
  58.         return Collections.singletonList(metricParameter);
  59.     }
  60. }
复制代码
BaseSingleTable 抽象类

BaseSingleTable是实现了 SqlMetric 接口的抽象类,实现了表级别检查规则中所需要参数的添加、错误数据SQL语句构造和实际值计算SQL语句构造和对过滤条件的处理等。

  • 这里定义了获取不符合规则的数据的基础SQL语句,判断类型的规则比如正则表达式检查和枚举值检查,只需要在基础SQL语句后面添加过滤条件即可。
  1.     protected StringBuilder invalidateItemsSql = new StringBuilder("select * from ${table}");
复制代码

  • 实际值计算SQL语句默认是计算不符合规则数据的行数
  1. String actualValueSql = "select count(1) as actual_value_"+ uniqueKey +" from ${invalidate_items_table}";
复制代码

  • 计算平均值、汇总值等统计类型的规则需要重新实现getActualValue()中的ExecuteSql。
  1. public abstract class BaseSingleTable implements SqlMetric {
  2.     // 这里定义了获取不符合规则的数据的基础 SQL 语句,判断类的规则比如正则表达式和枚举值检查,只需要在基础SQL后面添加过滤条件即可。
  3.     protected StringBuilder invalidateItemsSql = new StringBuilder("select * from ${table}");
  4.     protected List<String> filters = new ArrayList<>();
  5.     protected HashMap<String,ConfigItem> configMap = new HashMap<>();
  6.     protected Set<String> requiredOptions = new HashSet<>();
  7.     public BaseSingleTable() {
  8.         configMap.put("table",new ConfigItem("table", "表名", "table"));
  9.         configMap.put("filter",new ConfigItem("filter", "过滤条件", "filter"));
  10.         requiredOptions.add("table");
  11.     }
  12.     @Override
  13.     public ExecuteSql getInvalidateItems(String uniqueKey) {
  14.         ExecuteSql executeSql = new ExecuteSql();
  15.         executeSql.setResultTable("invalidate_items_" + uniqueKey);
  16.         executeSql.setSql(invalidateItemsSql.toString());
  17.         executeSql.setErrorOutput(isInvalidateItemsCanOutput());
  18.         return executeSql;
  19.     }
  20.     @Override
  21.     public ExecuteSql getActualValue(String uniqueKey) {
  22.         ExecuteSql executeSql = new ExecuteSql();
  23.         executeSql.setResultTable("invalidate_count_" + uniqueKey);
  24.         String actualValueSql = "select count(1) as actual_value_"+ uniqueKey +" from ${invalidate_items_table}";
  25.         executeSql.setSql(actualValueSql);
  26.         executeSql.setErrorOutput(false);
  27.         return executeSql;
  28.     }
  29.     @Override
  30.     public CheckResult validateConfig(Map<String, Object> config) {
  31.         return ConfigChecker.checkConfig(config, requiredOptions);
  32.     }
  33.     @Override
  34.     public void prepare(Map<String, String> config) {
  35.         if (config.containsKey("filter")) {
  36.             filters.add(config.get("filter"));
  37.         }
  38.         addFiltersIntoInvalidateItemsSql();
  39.     }
  40.     private void addFiltersIntoInvalidateItemsSql() {
  41.         if (filters.size() > 0) {
  42.             invalidateItemsSql.append(" where ").append(String.join(" and ", filters));
  43.         }
  44.     }
  45.     @Override
  46.     public MetricLevel getLevel() {
  47.         return MetricLevel.TABLE;
  48.     }
  49. }
复制代码
BaseSingleTableColumn 抽象类

BaseSingleTableColumn是列级别的抽象实现类,主要是添加列级别规则的通用参数。
  1. public abstract class BaseSingleTableColumn extends BaseSingleTable {
  2.     public BaseSingleTableColumn() {
  3.         super();
  4.         configMap.put("column",new ConfigItem("column", "列名", "column"));
  5.         requiredOptions.add("column");
  6.     }
  7.     @Override
  8.     public Map<String, ConfigItem> getConfigMap() {
  9.         return configMap;
  10.     }
  11.     @Override
  12.     public MetricLevel getLevel() {
  13.         return MetricLevel.COLUMN;
  14.     }
  15.     @Override
  16.     public boolean isInvalidateItemsCanOutput() {
  17.         return false;
  18.     }
  19. }
复制代码
第二步

了解完上面的三个基础类以后,自定义一个Metric就变得格外简单了。
基础工作

在 datavines-metric-plugins 下创建一个新规则的 module

在 pom.xml 中添加
  1. <dependency>
  2.      <groupId>io.datavines</groupId>
  3.      <artifactId>datavines-metric-base</artifactId>
  4.      <version>${project.version}</version>
  5. </dependency>
复制代码
以 枚举值检查 规则为例来讲解


  • 判断要实现的规则的级别,因为枚举值检查是列级别,所以继承 BaseSingleTableColumn 即可。
  • 在构造函数中的configMap添加enum_list参数用于返回给前端进行展示,在requiredOptions添加enum_list用于参数的检查。
  • 实现英文名、中文名、规则维度、规则类型这些基础的属性。
  • 因为枚举值检查规则是为了找出在枚举值列表中的数据,所以只需要在fileters这个数组里面加入(${column} in ( ${enum_list} )),prepare()方法会自动进行不符合规则的SQL语句构造。
  • 实现suitableType()方法添加规则适用的字段类型。
  1. public class ColumnInEnums extends BaseSingleTableColumn {
  2.     public ColumnInEnums(){
  3.         super();
  4.         configMap.put("enum_list",new ConfigItem("enum_list", "枚举值列表", "enum_list"));
  5.         requiredOptions.add("enum_list");
  6.     }
  7.     @Override
  8.     public String getName() {
  9.         return "column_in_enums";
  10.     }
  11.     @Override
  12.     public String getZhName() {
  13.         return "枚举值检查";
  14.     }
  15.     @Override
  16.     public MetricDimension getDimension() {
  17.         return MetricDimension.EFFECTIVENESS;
  18.     }
  19.     @Override
  20.     public MetricType getType() {
  21.         return MetricType.SINGLE_TABLE;
  22.     }
  23.     @Override
  24.     public boolean isInvalidateItemsCanOutput() {
  25.         return true;
  26.     }
  27.     @Override
  28.     public void prepare(Map<String, String> config) {
  29.         if (config.containsKey("enum_list") && config.containsKey("column")) {
  30.             filters.add(" (${column} in ( ${enum_list} )) ");
  31.         }
  32.         super.prepare(config);
  33.     }
  34.     @Override
  35.     public List<DataVinesDataType> suitableType() {
  36.         return Arrays.asList(DataVinesDataType.NUMERIC_TYPE, DataVinesDataType.STRING_TYPE, DataVinesDataType.DATE_TIME_TYPE);
  37.     }
  38. }
复制代码
第三步

非常重要的一步

  • 在 resources 目录下创建META-INF/plugins目录。
  • 在 plugins 目录下创建文件并且命名为io.datavines.metric.api.SqlMetric。
  • 在文件中添加column_in_enums=io.datavines.metric.plugin.ColumnInEnums。
第四步

打包成jar放到 datavines 目录下的libs目录下即可。
收工!自定义 Metric 就这样轻松搞定了。
加入我们

Datavines 的目标是成为更好的数据可观测性领域的开源项目,为更多的用户去解决元数据管理和数据质量管理中遇到的问题。在此我们真诚欢迎更多的贡献者参与到社区建设中来,和我们一起成长,携手共建更好的社区。

关于Datavane

Datavane 是一个专注于大数据领域的开源组织(社区),由一群大数据领域优秀的开源项目作者共同创建,旨在帮助开源项目作者更好的建设项目、为大众提供高质量的开源软件,宗旨是:只为做一个好软件。目前已经聚集了一批优质的开源项目,涉及到数据集成、大数据组件管理、数据质量等。
在 Datavane 社区中,所有的项目都是开源开放的,代码质量和架构设计优质的潜力项目。社区保持开放中立、协作创造、坚持精品,鼓励所有的开发者、用户和贡献者积极参与我们的社区、共同合作,创新创造,建设一个更加强大的开源社区。
官    网: http://www.datavane.org/
Github : https://github.com/datavane

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表