教程 | Datavines 自定義數據質量檢查規則(Metric)

来源:https://www.cnblogs.com/simple-focus/archive/2023/06/27/17507671.html
-Advertisement-
Play Games

Metric 是 Datavines 中一個核心概念,一個 Metric 表示一個數據質量檢查規則,比如空值檢查和表行數檢查都是一個規則。Metric 採用插件化設計,用戶可以根據自己的需求來實現一個 Metric。下麵我們來詳細講解一下如何自定義`Metric`。 ### 第一步 我們先瞭解下幾個 ...


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 的目標是成為更好的數據可觀測性領域的開源項目,為更多的用戶去解決元數據管理和數據質量管理中遇到的問題。在此我們真誠歡迎更多的貢獻者參與到社區建設中來,和我們一起成長,攜手共建更好的社區。

關於Datavane

Datavane 是一個專註於大數據領域的開源組織(社區),由一群大數據領域優秀的開源項目作者共同創建,旨在幫助開源項目作者更好的建設項目、為大眾提供高質量的開源軟體,宗旨是:只為做一個好軟體。目前已經聚集了一批優質的開源項目,涉及到數據集成、大數據組件管理、數據質量等。

Datavane 社區中,所有的項目都是開源開放的,代碼質量和架構設計優質的潛力項目。社區保持開放中立、協作創造、堅持精品,鼓勵所有的開發者、用戶和貢獻者積极參与我們的社區、共同合作,創新創造,建設一個更加強大的開源社區。

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • > 下午寫了一個操作`XML`文件的類庫,後來不用了,~~水篇~~文章存個檔📋 ## 整體功能 `XMLHelper.cs`主要提供以下功能: 1. 載入XML文件:從文件路徑或字元串中載入XML文檔,並返回`XmlDocument`對象。 2. 保存XML文件:將XmlDocument對象保存為 ...
  • [TOC] 上個月換工作,新項目又要重新搭建基礎框架,把日誌實現部分單獨記錄下來方便以後參考。 # 自定義日誌類 代碼大部分使用ChatGPT生成,人工進行了測試和優化,主要特點: * 線程安全,日誌非同步寫入文件不影響業務邏輯 * 支持過期文件自動清理,也可自定義清理邏輯 * 緩存隊列有記憶體上限防呆 ...
  • # 個人博客-給推薦文章添加排序欄位 # 前言 前篇文章優化了推薦文章的載入,但是呢,還是不太滿意,之前是按照文章的發佈日期去排序的,既然是推薦文章,還是得用一個欄位去專門管理順序。 設計思路: 給推薦文章表添加一個排序欄位,然後寫一個修改方法即可。 # 資料庫欄位 這裡的數據類型以sqlite3為 ...
  • 大家好,我是沙漠盡頭的狼。 在 [Dotnet9](https://dotnet9.com) 上線線上小工具和小游戲後,伺服器的壓力感覺挺大的,打開25個頁面,記憶體占用170MB左右,CPU保持在60~70%,看來Server真不適合搞這類交互較多的程式(伺服器配置:2核4G記憶體),所以站長加急上線 ...
  • 支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。 Redis作為一款主流的緩存工具在業內已廣受歡迎。本文將會介紹操作Redis的一種最簡單的方法。 本文假定你身邊已有安裝好的Redis應用,該應用的網路地址為(ip+p ...
  • 問題:在 Linux 下的 vim 編輯過程中,由於某種原因異常退出正在編輯的文件,再次編輯該文件時,會出現如下提示:[O]pen Read-Only, (E)dit anyway, ®ecover, (D)elete it, (Q)uit, (A)bort: 原因:使用vim編輯文件實際是先cop ...
  • MRS相同功能代碼管理應用筆記 使用 MounRiver(以下簡稱 MRS )進行 RISC-V 單片機開發時,工程目錄下往往存在多個文件夾與文件,我們只需要著重關註截圖中紅框所示的部分,它們自上而下分別是內核、調試、鏈接、外設、啟動與用戶文件夾。除此之外的文件夾與文件,均是由編譯器自動創建,開發過 ...
  • 當我們輸入ls 再按下TAB時, 會自動列出當前路徑下所有的文件; 當我們輸入ls a 再按下TAB時, 會自動列出當前路徑下所有以a開頭的文件; 若只有一個以a開頭的文件, 將會自動補全; 這是怎麼做到的? 本文將帶你一探究竟 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...