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

news2024/11/17 3:01:42

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

第一步

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

SqlMetric 接口

SqlMetric接口中定义了规则的各种属性和操作的接口。

@SPI
public interface SqlMetric {
    // 中文名
    String getName();
    // 英文名
    String getZhName();
    // 根据系统的语言进行名字返回
    default String getNameByLanguage(boolean isEn) {
        return isEn ? getName() : getZhName();
    }
    // 规则属于哪个维度,比如准确性、唯一性等等
    MetricDimension getDimension();
    // 规则的类型,包括单表检查、单表自定义检查
    MetricType getType();
    // 规则的级别,比如表级别、列级别
    default MetricLevel getLevel() {
        return MetricLevel.NONE;
    }
    // 是否支持错误数据输出
    boolean isInvalidateItemsCanOutput();

    /**
     * 获取不符合规则的数据的SQL语句
     * @return ExecuteSql
     */
    ExecuteSql getInvalidateItems(String uniqueKey);

    /**
     * 计算实际值的SQL语句
     * @return ExecuteSql
     */
    ExecuteSql getActualValue(String uniqueKey);

    /**
     * 实际值的字段名
     */
    default String getActualName() {
        return "actual_value";
    }
    // 实际值的类型,比如数字,百分比或者列表
    default String getActualValueType() {
        return MetricActualValueType.COUNT.getDescription();
    }
    // 对参数进行检查并输出检查结果
    CheckResult validateConfig(Map<String,Object> config);
    //规则所需要的参数
    Map<String, ConfigItem> getConfigMap();
    //构造规则前需要做的检查
    void prepare(Map<String,String> config);

    default String getIssue() {
        return "";
    }
    // 适合哪些字段类型
    List<DataVinesDataType> suitableType();
    // 是否支持多选,比如表行数检查支持多张表
    default boolean supportMultiple() {
        return false;
    }
    // 对规则参数的重新构造,配合表行数多张表检查
    default List<Map<String,Object>> getMetricParameter(Map<String,Object> metricParameter) {
        return Collections.singletonList(metricParameter);
    }
}

BaseSingleTable 抽象类

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

  • 这里定义了获取不符合规则的数据的基础SQL语句,判断类型的规则比如正则表达式检查和枚举值检查,只需要在基础SQL语句后面添加过滤条件即可。
    protected StringBuilder invalidateItemsSql = new StringBuilder("select * from ${table}");
  • 实际值计算SQL语句默认是计算不符合规则数据的行数
String actualValueSql = "select count(1) as actual_value_"+ uniqueKey +" from ${invalidate_items_table}"; 
  • 计算平均值、汇总值等统计类型的规则需要重新实现getActualValue()中的ExecuteSql
public abstract class BaseSingleTable implements SqlMetric {
    // 这里定义了获取不符合规则的数据的基础 SQL 语句,判断类的规则比如正则表达式和枚举值检查,只需要在基础SQL后面添加过滤条件即可。
    protected StringBuilder invalidateItemsSql = new StringBuilder("select * from ${table}");

    protected List<String> filters = new ArrayList<>();

    protected HashMap<String,ConfigItem> configMap = new HashMap<>();

    protected Set<String> requiredOptions = new HashSet<>();

    public BaseSingleTable() {
        configMap.put("table",new ConfigItem("table", "表名", "table"));
        configMap.put("filter",new ConfigItem("filter", "过滤条件", "filter"));

        requiredOptions.add("table");
    }

    @Override
    public ExecuteSql getInvalidateItems(String uniqueKey) {
        ExecuteSql executeSql = new ExecuteSql();
        executeSql.setResultTable("invalidate_items_" + uniqueKey);
        executeSql.setSql(invalidateItemsSql.toString());
        executeSql.setErrorOutput(isInvalidateItemsCanOutput());
        return executeSql;
    }

    @Override
    public ExecuteSql getActualValue(String uniqueKey) {
        ExecuteSql executeSql = new ExecuteSql();
        executeSql.setResultTable("invalidate_count_" + uniqueKey);
        String actualValueSql = "select count(1) as actual_value_"+ uniqueKey +" from ${invalidate_items_table}";
        executeSql.setSql(actualValueSql);
        executeSql.setErrorOutput(false);
        return executeSql;
    }

    @Override
    public CheckResult validateConfig(Map<String, Object> config) {
        return ConfigChecker.checkConfig(config, requiredOptions);
    }

    @Override
    public void prepare(Map<String, String> config) {
        if (config.containsKey("filter")) {
            filters.add(config.get("filter"));
        }

        addFiltersIntoInvalidateItemsSql();
    }

    private void addFiltersIntoInvalidateItemsSql() {
        if (filters.size() > 0) {
            invalidateItemsSql.append(" where ").append(String.join(" and ", filters));
        }
    }

    @Override
    public MetricLevel getLevel() {
        return MetricLevel.TABLE;
    }
}

BaseSingleTableColumn 抽象类

BaseSingleTableColumn是列级别的抽象实现类,主要是添加列级别规则的通用参数。

public abstract class BaseSingleTableColumn extends BaseSingleTable {

    public BaseSingleTableColumn() {
        super();
        configMap.put("column",new ConfigItem("column", "列名", "column"));
        requiredOptions.add("column");
    }

    @Override
    public Map<String, ConfigItem> getConfigMap() {
        return configMap;
    }

    @Override
    public MetricLevel getLevel() {
        return MetricLevel.COLUMN;
    }

    @Override
    public boolean isInvalidateItemsCanOutput() {
        return false;
    }
}

第二步

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

基础工作

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

在这里插入图片描述

在 pom.xml 中添加

 <dependency>
     <groupId>io.datavines</groupId>
     <artifactId>datavines-metric-base</artifactId>
     <version>${project.version}</version>
 </dependency>

以 枚举值检查 规则为例来讲解

  • 判断要实现的规则的级别,因为枚举值检查是列级别,所以继承 BaseSingleTableColumn 即可。
  • 在构造函数中的configMap添加enum_list参数用于返回给前端进行展示,在requiredOptions添加enum_list用于参数的检查。
  • 实现英文名、中文名、规则维度、规则类型这些基础的属性。
  • 因为枚举值检查规则是为了找出在枚举值列表中的数据,所以只需要在fileters这个数组里面加入(${column} in ( ${enum_list} ))prepare()方法会自动进行不符合规则的SQL语句构造。
  • 实现suitableType()方法添加规则适用的字段类型。
public class ColumnInEnums extends BaseSingleTableColumn {

    public ColumnInEnums(){
        super();
        configMap.put("enum_list",new ConfigItem("enum_list", "枚举值列表", "enum_list"));
        requiredOptions.add("enum_list");
    }

    @Override
    public String getName() {
        return "column_in_enums";
    }

    @Override
    public String getZhName() {
        return "枚举值检查";
    }

    @Override
    public MetricDimension getDimension() {
        return MetricDimension.EFFECTIVENESS;
    }

    @Override
    public MetricType getType() {
        return MetricType.SINGLE_TABLE;
    }

    @Override
    public boolean isInvalidateItemsCanOutput() {
        return true;
    }

    @Override
    public void prepare(Map<String, String> config) {
        if (config.containsKey("enum_list") && config.containsKey("column")) {
            filters.add(" (${column} in ( ${enum_list} )) ");
        }
        super.prepare(config);
    }

    @Override
    public List<DataVinesDataType> suitableType() {
        return Arrays.asList(DataVinesDataType.NUMERIC_TYPE, DataVinesDataType.STRING_TYPE, DataVinesDataType.DATE_TIME_TYPE);
    }
}

第三步

非常重要的一步

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

第四步

打包成jar放到 datavines 目录下的libs目录下即可。

收工!自定义 Metric 就这样轻松搞定了。

加入我们

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

  • 项目地址: https://github.com/datavane/datavines
  • 问题和建议: https://github.com/datavane/datavines/issues
  • 贡献代码: https://github.com/datavane/datavines/pulls

关于Datavane

Datavane 是一个专注于大数据领域的开源组织(社区),由一群大数据领域优秀的开源项目作者共同创建,旨在帮助开源项目作者更好的建设项目、为大众提供高质量的开源软件,宗旨是:只为做一个好软件。目前已经聚集了一批优质的开源项目,涉及到数据集成、大数据组件管理、数据质量等。

Datavane 社区中,所有的项目都是开源开放的,代码质量和架构设计优质的潜力项目。社区保持开放中立、协作创造、坚持精品,鼓励所有的开发者、用户和贡献者积极参与我们的社区、共同合作,创新创造,建设一个更加强大的开源社区。

官 网: http://www.datavane.org/
Github : https://github.com/datavane

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF 零基础入门笔记(3):数据绑定详解(更新中)

文章目录 文章合集数据绑定数据绑定实战事件通知型数据驱动&#xff0c;双向绑定资源绑定数据源绑定全局数据源后端和前端绑定问题 文章合集 WPF基础知识博客专栏 WPF微软文档 WPF控件文档 B站对应WPF数据绑定视频教程 数据绑定 我们在之前的文章中&#xff0c;详细解释了数…

windows配置jmeter定时任务

场景&#xff1a; 需要让脚本在指定的执行 步骤&#xff1a; 准备jmeter脚本&#xff0c;保证在命令行中可以调用脚本且脚本运行正常&#xff1a;"C:\Apache\jmeter\bin\jmeter.bat" -n -t C:\tests\test_plan.jmx -l C:\tests\results.jtl -t : 指定执行jmeter脚…

chatgpt赋能python:Python计算CCI指标的介绍

Python计算CCI指标的介绍 CCI&#xff08;Commodity Channel Index&#xff09;是一种技术指标&#xff0c;是推断价格高低位和趋势变化的一种工具。通过计算股票、期货、外汇和其他市场的典型价格、最高价和最低价以及CCI的值&#xff0c;可以预测未来价格趋势并进行交易。 …

Solidity第二次作业

目录 第一题 第二题 第三题 第四题 第五题 第六题 第一题 // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.0; contract math { //1.根据所属类型值域&#xff0c;修改变量numa与numb值 uint8 numa 256; int8 numb 128; int numc 255; fun…

安科瑞无线测温系统在高压开关柜中的应用

摘要&#xff1a;高压开关柜是配电系统中重要的组成部分&#xff0c;其主要作用是控制电荷、分配电能和开断电流等&#xff0c;对维持系统的稳定性有一定的保障作用。将无线测温技术应用于高压开关柜&#xff0c;可以实现对其进行实时的动态监测&#xff0c;有助于相关工作人员…

使用CSS的polygon属性画各个方向的半圆环

CSS的polygon属性 CSS polygon()函数是一个图形函数&#xff0c;用于指定某种基本图形类型。polygon()函数用于定义一个多边形 .container{width: 50px;height: 50px;border: 13px solid #0c73fe;border-radius: 50px;/* 上半圆环 */clip-path: polygon(100% 50%, 0 50%, 0 0, …

Redis cluster集群搭建集群增删集群节点

1.Redis cluster集群架构&#xff08;本机ip:192.168.2.100&#xff09; 建立三台linux服务器&#xff0c;分别是192.168.2.61、192.168.2.62、192.168.2.63 1.1.建立192.168.2.61Linux服务器 1.配置Linux服务器 # 在 /etc/sysconfig/network-scripts/ifcfg-eno16777736文件…

C# 读写ABPLC( Allen Bradley)

1.安装 libplctag.net库 GitHub - libplctag/libplctag.NET: This is a .NET wrapper for libplctag. 2.PLC IP和tag 3.写入值 var myTag new TagReal(){//Name is the full path to tag. Name "HMI_F26[0]",//Gateway is the IP Address of the PLC or communicat…

7-WebApis-3

Web APIs - 3 目标&#xff1a;学习事件流&#xff0c;事件委托&#xff0c;其他事件等知识&#xff0c;优化多个事件绑定和实现常见网页交互 事件流移除事件监听其他事件元素尺寸与位置综合案例 事件流 为什么要学习事件流&#xff1f; 可以帮我们解决一些疑惑&#xff0c;比…

npm全局安装的包在cmd能找到,在powershell中找不到

背景 使用npm i g 全局安装的包&#xff0c;比如&#xff1a;eslint&#xff1b;安装完成后&#xff0c;执行eslint相关命令&#xff0c;显示命令不存在&#xff1b;以为是node没配置全局环境变量&#xff0c;检查发现配置了&#xff1b;后来试了一下在cmd是可以使用的&#x…

蓝桥杯专题-试题版-【十进制转十六进制】【十六进制转八进制】【十六进制转十进制】【数的读法】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

TCP客户端的WPF实现

1、TCP实现类 internal class TcpClient{Socket ClientSocket { get; set; }public byte[] ReceiveBuffer { get; set; }/// <summary>/// 构造函数/// </summary>/// <param name"receiveBufferLength"></param>public TcpClient(int rece…

关于Eclipse 运行JavaWeb项目发生Source not found的情况

描述是说&#xff0c;class源文件未找到。其实问题就是出在没有部署。但是我们查看部署时&#xff0c;发现我们已经部署过了。 其实&#xff0c;这个比较细节的地方。 你可以右键单击这个jsp项目&#xff0c;然后点击 run as。发现它其实是没有配置run运行文件。这就导致是发现…

【wireshark】时间显示

默认的好像是个相对时间 可以显示当前时间 在视图里选择

Xcode 常用操作相关

代码折叠 选择 Xcode -> Preferences -> Text Editing勾选Code folding ribbon 清空最近打开项目 File -> Open Recent -> Clear Menu

模板匹配Template Matching

实现代码&#xff1a; import cv2 import numpy as np def template_demo(tpl,target):methods[cv2.TM_SQDIFF_NORMED,cv2.TM_CCORR_NORMED,cv2.TM_CCOEFF_NORMED]th,twtpl.shape[:2]for md in methods:start_timecv2.getTickCount()# 匹配结果resultcv2.matchTemplate(target…

【Linux】linux | shell | 获取日期

1、获取上一天 1&#xff09;代码 date -d "1 days ago" %Y-%m-%d 2&#xff09;结果 ~~

chatgpt赋能python:Python计算累乘的优秀解决方案

Python计算累乘的优秀解决方案 在python编程中&#xff0c;经常需要进行数值计算。其中一个最基本的计算就是累乘。累乘可以基于一组数字进行&#xff0c;计算它们的乘积。比如&#xff0c;如果输入的数字序列是[1,2,3,4]&#xff0c;则累乘结果为24。 在本文中&#xff0c;我…

MediaPipe简介

有没有想过“OK Google”背后的含义是什么?嗯,这就是 MediaPipe。如果您刚刚开始使用 MediaPipe,并且这是您阅读的第一篇文章,那么恭喜您,您找到了正确的地方。本文将介绍MediaPipe的基础知识、解决方案之间的差异以及框架。 官方文档指出,推理是实时的,只需几行代码即可…

Qt定时器类QTimer

目录 public/slot function signals static public function 示例&#xff08;获取系统时间并且将其显示到窗口中&#xff09;&#xff1a; 示例主要代码&#xff08;每间隔一秒向控制台发送一条消息&#xff09;&#xff1a; 注意事项&#xff1a; Qt定时器类QTimer是一个…