# 数据清洗组件使用说明
# 组件说明
数据清洗组件用于对数据进行审查和校验的过程,并根据规则纠正数据中的错误。包括:脱敏规则、转换规则、加密规则、解密规则、生成数据规则、自定义清洗规则。
# 配置项说明
配置名称 | 数据类型 | 是否必须 | 默认值 | 描述 |
---|---|---|---|---|
节点名称 | String | 是 | - | 当前创建的节点名称,由用户自定义且不可为空。命名可包含字母、数字、下划线。 |
字段名称 | String | 是 | - | 从前置步骤输出流中选择字段名称。 |
清洗规则 | String | 是 | - | 配置的清洗规则列表。 |
操作 | - | 否 | - | 对规则进行添加、上移、下移、删除等操作。 |
# 清洗规则说明
# 1、解密规则:
规则名称 | 规则描述 | 规则示例 |
---|---|---|
AES解密 | 对数据进行AES解密,需要密钥secretKey,密钥为16位数字(默认密钥:1234567890123456,默认模式:ECB,默认填充:pkcs) | 原始格式: 输入类型:字符串,字段值: "M5RMO9SiEldBeoWOJ/+PAw==" 目标格式: 输出类型:字符串,字段值: "12345" |
Base64解密 | 对数据进行Base64解密 | 原始格式: 输入类型:字符串,字段值: "MTIzNDU=" 目标格式: 输出类型:字符串,字段值: "12345" |
DES解密 | 对数据进行DES解密,需要密钥secretKey,密钥为8位数字(默认密钥:12345678,默认模式:ECB,默认填充:pkcs) | 原始格式: 输入类型:字符串,字段值: "AGgKdx/Qic8=" 目标格式: 输出类型:字符串,字段值: "12345" |
# 2、加密规则
规则名称 | 规则描述 | 规则示例 |
---|---|---|
AES加密 | 对数据进行AES加密,需要密钥secretKey,密钥为16位数字(默认密钥:1234567890123456,默认模式:ECB,默认填充:pkcs) | 原始格式: 输入类型:字符串,字段值: "12345" 目标格式: 输出类型:字符串,字段值: "M5RMO9SiEldBeoWOJ/+PAw==" |
Base64加密 | 对数据进行Base64加密 | 原始格式: 输入类型:字符串,字段值: "12345" 目标格式: 输出类型:字符串,字段值: "MTIzNDU=" |
DES加密 | 对数据进行DES加密,需要密钥secretKey,密钥为8位数字(默认密钥:12345678,默认模式:ECB,默认填充:pkcs) | 原始格式: 输入类型:字符串,字段值: "12345" 目标格式: 输出类型:字符串,字段值: "AGgKdx/Qic8=" |
MD5加密 | 对数据进行MD5加密 | 原始格式: 输入类型:字符串,字段值: "12345" 目标格式: 输出类型:字符串,字段值: "827ccb0eea8a706c4c34a16891f84e7b" |
# 3、脱敏规则
规则名称 | 规则描述 | 规则示例 |
---|---|---|
地址脱敏 | 实现地址脱敏至第二级 | 原始格式: 输入类型:字符串,字段值: "北京市海淀区中关村街道" 目标格式: 输出类型:字符串,字段值: "北京市海淀区*****" |
车牌号脱敏 | 只保留前2后3位 | 原始格式: 输入类型:字符串,字段值: "陕A65KW3" 目标格式: 输出类型:字符串,字段值: "陕A***KW3" |
卡号脱敏 | 只展示前3后4位 | 原始格式: 输入类型:字符串,字段值: "30010019990101123X" 目标格式: 输出类型:字符串,字段值: "300***********123X" |
邮箱脱敏 | 只展示第一位和邮箱域名 | 原始格式: 输入类型:字符串,字段值: "12345678@163.com" 目标格式: 输出类型:字符串,字段值: "1****@163.com" |
姓名脱敏 | 保留姓名第一位 | 原始格式: 输入类型:字符串,字段值: "张三" 目标格式: 输出类型:字符串,字段值: "张*" |
证件号码脱敏 | 只展示前3后4位 | 原始格式: 输入类型:字符串,字段值: "610203199109120975" 目标格式: 输出类型:字符串,字段值: "610***********0975" |
手机号码脱敏 | 只展示前3后4位 | 原始格式: 输入类型:字符串,字段值: "18909231098" 目标格式: 输出类型:字符串,字段值: "189****1098" |
通用脱敏 | 根据输入的字符位置进行脱敏,起始位置为1 | 原始格式: 输入类型:字符串,字段值: "这是一个通用脱敏规则" 目标格式: 输出类型:字符串,字段值: "这****用脱敏规则"(假设startIndex=2,endIndex=5,mask=#) |
# 4、转换规则
规则名称 | 规则描述 | 规则示例 |
---|---|---|
清除空格符 | 清除所有空格符 | 原始格式: 输入类型:字符串,字段值: "包含空格 的 字符串" 目标格式: 输出类型:字符串,字段值: "包含空格的字符串" |
日期格式化 | 将日期转化成指定格式的字符串 | 原始格式: 输入类型:日期,字段值: "Fri Jul 26 15:47:12 CST 2024" 目标格式: 输出类型:字符串,字段值: "2024-07-26 15:47:12"(假设默认格式: yyyy-MM-dd HH:mm:ss) |
字段赋值 | 将选中字段的值赋值给当前字段,且字段类型不变 | 原始格式: 输入类型:任意类型,字段值: 任意值 选择字段类型:字符串,字段值: "123456" 目标格式: 输出类型:字符串,字段值: "123456" |
字段拼接 | 将多个字段的值按顺序拼成字符串赋给当前字段,且当前字段输出格式为字符串 | 原始格式: 输入类型:任意类型,字段值: 任意值 字段1类型:字符串,字段值: "123456" 字段2类型:字符串,字段值: "aabbcc" 目标格式: 输出类型:字符串,字段值:"123456aabbcc' |
字段设置常量 | 将字段值设置为字符串常量 | 原始格式: 输入类型:任意类型,字段值: 任意值 目标格式: 输出类型:字符串,字段值: "12345"(假设常量设置为:12345) |
删除字段 | 删除当前字段 | 原始格式: 输入类型:任意类型,字段值: 任意值 目标格式: 输出类型:无,字段值: 无 |
字段改名 | 字段改名 | 原始格式: 字段名myName,输入类型:任意类型,字段值: 任意值 目标格式: 字段名reName(假设重名成:reName),输出类型:任意类型,字段值: 任意值 |
字母转小写 | 字母大写转小写 | 原始格式: 输入类型:字符串,字段值: "JOHN" 目标格式: 输出类型:字符串,字段值: "john" |
字母转大写 | 字母小写转大写 | 原始格式: 输入类型:字符串,字段值: "john" 目标格式: 输出类型:字符串,字段值: "JOHN" |
金额大写转小写 | 大写金额转小写数字 | 原始格式: 输入类型:字符串,字段值: "壹仟零贰元整" 目标格式: 输出类型:字符串,字段值: "1002" |
金额小写转大写 | 金额数字转大写数字 | 原始格式: 输入类型:字符串,字段值: "1200.43" 目标格式: 输出类型:字符串,字段值: "壹仟贰佰元肆角叁分" |
删除字符串中的数字 | 删除字符串中的数字 | 原始格式: 输入类型:字符串,字段值: "dyn20240703" 目标格式: 输出类型:字符串,字段值: "dyn" |
替换字符串 | 替换字符为设定字符,支持正则匹配替换 | 原始格式: 输入类型:字符串,字段值: "测试字符串,是一些数字12345和字母abcde"(假设正则表达式:\d+,替换字符:&) 目标格式: 输出类型:字符串,字段值: "测试字符串,是一些数字&和字母abcde" |
字符串截取 | 根据指定的起始位置和终止位置,截取字符串,起始位置为0 | 原始格式: 输入类型:字符串,字段值: "字符串截取" 目标格式: 输出类型:字符串,字段值: "符串截"(假设startIndex=1,endInd |
截取符号之后字符 | 截取符号之后字符 | 原始格式: 输入类型:字符串,字段值: "dyn#20240703" 目标格式: 输出类型:字符串,字段值: "20240703"(假设截取字符串为:#) |
截取符号之前字符 | 截取符号之前字符 | 原始格式: 输入类型:字符串,字段值: "dyn#20240703" 目标格式: 输出类型:字符串,字段值: "dyn"(假设截取字符串为:#) |
字符串转日期 | 将字符串类型转换为日期类型 | 原始格式: 输入类型:字符串,字段值: "2024-07-26 15:47:12"(设置时间格式: yyyy-MM-dd HH:mm:ss) 目标格式: 输出类型:日期,字段值: "Fri Jul 26 15:47:12 CST 2024" |
字符串转为数字 | 字符串转为数字 | 原始格式: 输入类型:字符串,字段值: "20240703" 目标格式: 输出类型:数字,字段值: 20240703 |
去除两端空格符 | 清除两端空格 | 原始格式: 输入类型:字符串,字段值: " 20240703 " 目标格式: 输出类型:数字,字段值: "20240703" |
时间戳转日期 | 时间戳转为日期类型 | 原始格式: 输入类型:时间戳,字段值: "1635176887000" 目标格式: 输出类型:日期,字段值: "Mon Oct 25 23:48:07 CST 2021" |
值映射 | 将一个字段的值映射为其他值 | 原始格式: 输入类型:字符串,字段值: 1 defaultValue字段类型:字符串,字段值: 男 valueMappings字段类型:字符串,字段值: {"1":"男","2":"女"} 目标格式: 输出类型:字符串,字段值: 男 |
# 5、生成数据规则
规则名称 | 规则描述 | 规则示例 |
---|---|---|
获取当前时间 | 获取当前时间 | 原始格式: 输入类型:任意,字段值: 任意值 目标格式: 输出类型:日期,字段值: "Wed Jul 03 14:23:58 CST 2024" |
生成UUID | 生成UUID | 原始格式: 输入类型:任意,字段值: 任意值 目标格式: 输出类型:字符串,字段值: "e0cd98ad-b136-4188-b963-1ed8132f97b5" |
# 6、自定义规则开发
如何开发一个“生成随机地址”的规则
1)下载“生成随机地址”的源代码:生成随机地址源代码。
2)开发前准备:开发需配置依赖,依赖com.primeton.di.engine-${version}.jar,此jar可在${Primeton-DI}安装目录/diserver下的lib下获取,version为当前产品版本号。
3)开发规则:CustomAddressFunction类是生成随机地址规则的核心实现。可以使用main方法来测试规则。
package com.primeton.di.customrules;
import org.apache.commons.lang3.tuple.Pair;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaString;
import org.pentaho.di.trans.steps.dynamictransformation.ITransformFunction;
import org.pentaho.di.trans.steps.dynamictransformation.TransformType;
import org.pentaho.di.trans.steps.dynamictransformation.TransfromRuleParam;
import java.util.List;
import java.util.Map;
/**
* 此示例为生成一个随机地址
* 需要依赖com.primeton.di.engine-8.2.0.0-DWS.jar
* @author cuipeng
* @create 2024-07-03
*/
public class CustomAddressFunction implements ITransformFunction {
private static String[] road="重庆大厦,黑龙江路,十梅庵街,遵义路,湘潭街,瑞金广场,仙山街,仙山东路,仙山西大厦,白沙河路,赵红广场,机场路,民航街,长城南路,流亭立交桥,虹桥广场,长城大厦,礼阳路,风岗街,中川路,白塔广场,兴阳路,文阳街,绣城路,河城大厦,锦城广场,崇阳街,华城路,康城街,正阳路,和阳广场,中城路,江城大厦,顺城路,安城街,山城广场,春城街,国城路,泰城街,德阳路,明阳大厦,春阳路,艳阳街,秋阳路,硕阳街,青威高速,瑞阳街,丰海路,双元大厦,惜福镇街道,夏庄街道,古庙工业园,中山街,太平路,广西街,潍县广场,博山大厦,湖南路,济宁街,芝罘路,易州广场,荷泽四路,荷泽二街,荷泽一路,荷泽三大厦,观海二广场,广西支街,观海一路,济宁支街,莒县路,平度广场,明水路,蒙阴大厦,青岛路,湖北街,江宁广场,郯城街,天津路,保定街,安徽路,河北大厦,黄岛路,北京街,莘县路,济南街,宁阳广场,日照街,德县路,新泰大厦,荷泽路,山西广场,沂水路,肥城街,兰山路,四方街,平原广场,泗水大厦,浙江路,曲阜街,寿康路,河南广场,泰安路,大沽街,红山峡支路,西陵峡一大厦,台西纬一广场,台西纬四街,台西纬二路,西陵峡二街,西陵峡三路,台西纬三广场,台西纬五路,明月峡大厦,青铜峡路,台西二街,观音峡广场,瞿塘峡街,团岛二路,团岛一街,台西三路,台西一大厦,郓城南路,团岛三街,刘家峡路,西藏二街,西藏一广场,台西四街,三门峡路,城武支大厦,红山峡路,郓城北广场,龙羊峡路,西陵峡街,台西五路,团岛四街,石村广场,巫峡大厦,四川路,寿张街,嘉祥路,南村广场,范县路,西康街,云南路,巨野大厦,西江广场,鱼台街,单县路,定陶街,滕县路,钜野广场,观城路,汶上大厦,朝城路,滋阳街,邹县广场,濮县街,磁山路,汶水街,西藏路,城武大厦,团岛路,南阳街,广州路,东平街,枣庄广场,贵州街,费县路,南海大厦,登州路,文登广场,信号山支路,延安一街,信号山路,兴安支街,福山支广场,红岛支大厦,莱芜二路,吴县一街,金口三路,金口一广场,伏龙山路,鱼山支街,观象二路,吴县二大厦,莱芜一广场,金口二街,海阳路,龙口街,恒山路,鱼山广场,掖县路,福山大厦,红岛路,常州街,大学广场,龙华街,齐河路,莱阳街,黄县路,张店大厦,祚山路,苏州街,华山路,伏龙街,江苏广场,龙江街,王村路,琴屿大厦,齐东路,京山广场,龙山路,牟平街,延安三路,延吉街,南京广场,东海东大厦,银川西路,海口街,山东路,绍兴广场,芝泉路,东海中街,宁夏路,香港西大厦,隆德广场,扬州街,郧阳路,太平角一街,宁国二支路,太平角二广场,天台东一路,太平角三大厦,漳州路一路,漳州街二街,宁国一支广场,太平角六街,太平角四路,天台东二街,太平角五路,宁国三大厦,澳门三路,江西支街,澳门二路,宁国四街,大尧一广场,咸阳支街,洪泽湖路,吴兴二大厦,澄海三路,天台一广场,新湛二路,三明北街,新湛支路,湛山五街,泰州三广场,湛山四大厦,闽江三路,澳门四街,南海支路,吴兴三广场,三明南路,湛山二街,二轻新村镇,江南大厦,吴兴一广场,珠海二街,嘉峪关路,高邮湖街,湛山三路,澳门六广场,泰州二路,东海一大厦,天台二路,微山湖街,洞庭湖广场,珠海支街,福州南路,澄海二街,泰州四路,香港中大厦,澳门五路,新湛三街,澳门一路,正阳关街,宁武关广场,闽江四街,新湛一路,宁国一大厦,王家麦岛,澳门七广场,泰州一路,泰州六街,大尧二路,青大一街,闽江二广场,闽江一大厦,屏东支路,湛山一街,东海西路,徐家麦岛函谷关广场,大尧三路,晓望支街,秀湛二路,逍遥三大厦,澳门九广场,泰州五街,澄海一路,澳门八街,福州北路,珠海一广场,宁国二路,临淮关大厦,燕儿岛路,紫荆关街,武胜关广场,逍遥一街,秀湛四路,居庸关街,山海关路,鄱阳湖大厦,新湛路,漳州街,仙游路,花莲街,乐清广场,巢湖街,台南路,吴兴大厦,新田路,福清广场,澄海路,莆田街,海游路,镇江街,石岛广场,宜兴大厦,三明路,仰口街,沛县路,漳浦广场,大麦岛,台湾街,天台路,金湖大厦,高雄广场,海江街,岳阳路,善化街,荣成路,澳门广场,武昌路,闽江大厦,台北路,龙岩街,咸阳广场,宁德街,龙泉路,丽水街,海川路,彰化大厦,金田路,泰州街,太湖路,江西街,泰兴广场,青大街,金门路,南通大厦,旌德路,汇泉广场,宁国路,泉州街,如东路,奉化街,鹊山广场,莲岛大厦,华严路,嘉义街,古田路,南平广场,秀湛路,长汀街,湛山路,徐州大厦,丰县广场,汕头街,新竹路,黄海街,安庆路,基隆广场,韶关路,云霄大厦,新安路,仙居街,屏东广场,晓望街,海门路,珠海街,上杭路,永嘉大厦,漳平路,盐城街,新浦路,新昌街,高田广场,市场三街,金乡东路,市场二大厦,上海支路,李村支广场,惠民南路,市场纬街,长安南路,陵县支街,冠县支广场,小港一大厦,市场一路,小港二街,清平路,广东广场,新疆路,博平街,港通路,小港沿,福建广场,高唐街,茌平路,港青街,高密路,阳谷广场,平阴路,夏津大厦,邱县路,渤海街,恩县广场,旅顺街,堂邑路,李村街,即墨路,港华大厦,港环路,馆陶街,普集路,朝阳街,甘肃广场,港夏街,港联路,陵县大厦,上海路,宝山广场,武定路,长清街,长安路,惠民街,武城广场,聊城大厦,海泊路,沧口街,宁波路,胶州广场,莱州路,招远街,冠县路,六码头,金乡广场,禹城街,临清路,东阿街,吴淞路,大港沿,辽宁路,棣纬二大厦,大港纬一路,贮水山支街,无棣纬一广场,大港纬三街,大港纬五路,大港纬四街,大港纬二路,无棣二大厦,吉林支路,大港四街,普集支路,无棣三街,黄台支广场,大港三街,无棣一路,贮水山大厦,泰山支路,大港一广场,无棣四路,大连支街,大港二路,锦州支街,德平广场,高苑大厦,长山路,乐陵街,临邑路,嫩江广场,合江路,大连街,博兴路,蒲台大厦,黄台广场,城阳街,临淄路,安邱街,临朐路,青城广场,商河路,热河大厦,济阳路,承德街,淄川广场,辽北街,阳信路,益都街,松江路,流亭大厦,吉林路,恒台街,包头路,无棣街,铁山广场,锦州街,桓台路,兴安大厦,邹平路,胶东广场,章丘路,丹东街,华阳路,青海街,泰山广场,周村大厦,四平路,台东西七街,台东东二路,台东东七广场,台东西二路,东五街,云门二路,芙蓉山村,延安二广场,云门一街,台东四路,台东一街,台东二路,杭州支广场,内蒙古路,台东七大厦,台东六路,广饶支街,台东八广场,台东三街,四平支路,郭口东街,青海支路,沈阳支大厦,菜市二路,菜市一街,北仲三路,瑞云街,滨县广场,庆祥街,万寿路,大成大厦,芙蓉路,历城广场,大名路,昌平街,平定路,长兴街,浦口广场,诸城大厦,和兴路,德盛街,宁海路,威海广场,东山路,清和街,姜沟路,雒口大厦,松山广场,长春街,昆明路,顺兴街,利津路,阳明广场,人和路,郭口大厦,营口路,昌邑街,孟庄广场,丰盛街,埕口路,丹阳街,汉口路,洮南大厦,桑梓路,沾化街,山口路,沈阳街,南口广场,振兴街,通化路,福寺大厦,峄县路,寿光广场,曹县路,昌乐街,道口路,南九水街,台湛广场,东光大厦,驼峰路,太平山,标山路,云溪广场,太清路".split(",");
private final static String FUNCTION_CATALOG = "自定义生成规则";
private final static String FUNCTION_SHOWNAME = "生成随机地址";
private final static String FUNCTION_DESC = "生成随机地址";
private final static String FUNCTION_EXAMPLE = "生成一个《利津路61号-10-3》的随机地址";
/**
*
* @param row 存储字段值(row.getLeft())及字段类型(row.getRight())
* @param params 传参
* @param previousMap 存储了每次每次规则的结果,比如两个规则,执行完第一个规则后的数据存入previousMap中,第二个规则就可以取到前一个规则的数据继续处理
* @return
* @throws Exception
*/
@Override
public Pair<Object, ValueMetaInterface> apply(Pair<Object, ValueMetaInterface> row, List<TransfromRuleParam> params, Map<String, Object> previousMap) throws Exception {
return Pair.of(getRoad(),getOutputColumnMeta(row.getRight().getName()));
}
/**
* 生成返回的类型
* @param name
* @return
*/
@Override
public ValueMetaInterface getOutputColumnMeta(String name) {
ValueMetaString v = new ValueMetaString();
v.setName(name);
return v;
}
/**
* 自定义规则名称
* @return
*/
@Override
public String name() {
return "CustomAddress";
}
/**
* 自定义规则类型:CONVERT、ADD、DELETE
* @return
*/
@Override
public TransformType getTransformType() {
return TransformType.ADD;
}
/**
* 规则分类:自定义规则分类
* @return
*/
@Override
public String getCatalog() {
return FUNCTION_CATALOG;
}
/**
* 自定义规则描述
* @return
*/
@Override
public String getDesc() {
return FUNCTION_DESC;
}
/**
* 自定义规则示例
* @return
*/
@Override
public String getExample() {
return FUNCTION_EXAMPLE;
}
/**
* 自定义规则展示名称
* @return
*/
@Override
public String showName() {
return FUNCTION_SHOWNAME;
}
@Override
public List<TransfromRuleParam> getParam() {
return null;
}
public static void main(String[] args) {
System.out.println(getRoad());
}
@Override
public boolean isSystemRule(){
return false;
}
private static String getRoad() {
int index=getNum(0,road.length-1);
String first=road[index];
String second=String.valueOf(getNum(11,150))+"号";
String third="-"+getNum(1,20)+"-"+getNum(1,10);
return first+second+third;
}
public static int getNum(int start, int end) {
return (int)(Math.random()*(end-start+1)+start);
}
}
4)在customrules\src\main\resources\META-INF\services下的文件中配置com.primeton.di.customrules.CustomAddressFunction,遵循SPI开发机制。
5)开发完成后,打包成jar文件,将jar放入${Primeton-DI}安装目录/diserver下的lib下及dws-server的lib下,重启DI和dws-server。
6)打开数据清洗组件,可以看到自定义生成规则,如图所示。