金仓KFS数据过滤-行过滤

70 阅读3分钟

关键字:

KingbaseFlysync、数据同步、数据过滤

一、skipeventbyvalue过滤器

KFS支持基于字段中某个值的sql过滤,使用 skipeventbyvalue过滤器+规则文件实现,比如:sql语句insert into xx(id,c1) values(1,’test’),过滤规则文件匹配字段c1的test值,如果值满足规则文件,那么就将此sql语句过滤掉,配置的值支持的数据类型为数值类型(int)、字符类型(varchar)、时间类型(date)。通过配置过滤规则,符合规则的dml语句将会被过滤、不在入库。

二、行过滤配置

在flysync.ini文件中添加如下配置:

svc-remote-filters= skipeventbyvalue  
-----过滤器中添加skipeventbyvalue
property=replicator.filter.skipeventbyvalue.definitionsFile=${replicator.home.dir}/support/filters-config/skipeventbyvalue.json
---------------指定skipeventbyvalue过滤规则文件路径

三、skipeventbyvalue.json过滤规则文件配置

3.1 配置文件说明

3.1.1 单条件过滤场景

过滤规则使用json格式,故配置文件的内容需要符合json格式,以下边配置为例,各个配置参数的含义为:

{
  "public.test": {  --------需要过滤的表名,其配置方式为模式名.表名-------
    "condition": {  -----------过滤规则主体---------
        "column": "AGE",  ----------AGE字段作为判断主体-----------
        "function": ">",    ----------过滤条件,可选>,<,<>,=,>=,<=----
        "value": 18,       ----------过滤条件阈值---------
        "operator": "",     ----------逻辑条件,可选and,or等-------
        "conditions": []    ----------多条件过滤规则主体,单条件不写,详情可见复合场景-----
      }
  }

该过滤规则表示,public.test表,AGE字段大于18的数据将被过滤丢弃,不做同步

3.1.2 多条件过滤场景

多字段单条件场景

{
    /* 等效于 WHERE AGE > 18 AND SEX = '女' */
    "public.test": {
        "condition": {
            "column": "",
            "function": "",
            "value": "",
            "operator": "",
            "conditions": [ {  -----------多条件情况下,过滤规则写在conditions内---
                "column": "AGE",
                "function": ">",
                "value": 18,
                "operator": "",
                "conditions": []
            },  ---------------第一字段条件结束后,使用逗号隔开----------
            {
                "column": "SEX",
                "function": "equals",  --------字符类型函数条件,详情见数据类型章节
                "value": "女",
                "operator": "AND",   ---------逻辑条件,同sql逻辑一致-----
                "conditions": []
            } ]
        }
    }
}

以上过滤规则表示,public.test表,age>18,且sex为女的数据将被过滤丢弃

/* 等效于 WHERE AGE > 18 AND SEX = '女' */

多字段多条件场景
{
    "public.test": {
        "condition": {
            "column": "",
            "function": "",
            "value": "",
            "operator": ""
            "conditions": [ { ----------单字段(AGE)多条件过滤规则开始----------
                "column": "",
                "function": "",
                "value": "",
                "operator": "",
                "conditions": [ { 
                    "column": "AGE",
                    "function": ">",
                    "value": 18,
                    "operator": "",
                    "conditions": []
                },
                {
                    "column": "AGE",
                    "function": "<",
                    "value": 35,
                    "operator": "AND",
                    "conditions": []
                } ]
            }, -----------------AGE字段过滤规则结束---------------
            {  ---------------SEX字段过滤规则主体-----------------
                "column": "SEX",
                "function": "equals",
                "value": "女",
                "operator": "AND"
                "conditions": []
            } ]
        }
    }
}

以上过滤规则表示,public.test表,AGE大于18,小于35,且sex为女的数据将被过滤丢弃 WHERE (AGE > 18 AND AGE < 35) AND SEX = '女'

3.2 数值规则类型介绍

KFS规则文件中支持配置不同的数据类型来匹配,主要是分为数值型(int、number、double等),字符型(varchar、nvchar等),时间类型(date、timestamp等)

3.2.1 数值类型

对于过滤字段值是数据类型的情况,配置规则文件如下:

 {
  /* 等效于 WHERE AGE > 18 */
  "SCHEMA_NAME_1.TABLE_NAME_1": {
    "condition": {
        "column": "AGE",
        "function": ">",  -----可选>,<,<>,>=,<=,=
        "value": 18,     -----规则使用的值
        "operator": "",
        "conditions": []
      }
  }

3.2.2 字符类型

{
  /* 等效于 WHERE SEX = '女' */
  "SCHEMA_NAME_1.TABLE_NAME_1": {
    "condition": {
        "column": "SEX",
        "function": "equals",
        "value": "女",
        "operator": "",
        "conditions": []
      }
  }

字符类型的函数配置为: equals = ,以上述例子举例,等效于WHERE SEX = '女 equalsignoreCase 不区分大小写,均作为大写匹配,等效于 WHERE upper(SEX) = upper('女') startsWith 后模糊,等效于 WHERE SEX LIKE '女%' endsWith 前模糊,等效于WHERE SEX LIKE '%女' contains 全模糊,等效于 WHERE SEX LIKE '%女%'

3.2.3 时间类型

{
    "SCHEMA_NAME_1.TABLE_NAME_1": {
        "condition": {
            "column": "BIRTH",
            "function": ">",   -----同数值类型----
            "value": "2008-08-08"
            "operator": ""
            "conditions": []
        }
    }

四、总结

skipeventbyvalue支持多字段、多条件过滤,支持and,or等逻辑结合,本文中仅举例AND,可以灵活组合,满足不同的场景