datax自定义transfrom 怎么写?
写在前面:
在使用datax数据处理过程中,我们常常要对某些字段进行处理,一般我们首先想到的是使用数据库自定义函数来处理,可是当遇到一些复杂的场景,写函数可能就比较困难,或者根本无法实现,即使实现了,可移植性也很差,比如我最近遇到的 要对身份证号脱敏的需求,需求是要按照SM3加密的方式去脱敏身份证号,之前我也用过oracle实现,因为oracle可以使用java源的方式,可是最近新的产品使用mysql,这样就导致要重写开发这个脱敏的需求。mysql不支持java源,使用函数写出SM3加密算法无疑工作量庞大,可参考的开源代码少,那如何实现呢?这时候 datax 自带的transform(转换)的作用就出来了,下面我们一起看看如何自定义transfrom,让transform完成你想要做的!
1.什么是datax的transform?
做过数据处理的都知道ETL ,ETL意思是 E(Extract)数据抽取 -->T(transform)数据转换 -->L(load)数据加载,那么datax作为一款阿里开源的ETL工具,当然这三步骤都是要实现的,datax中的reader插件 相当于E的部分,writer插件相当于L的部分。那么我们这里要介绍的就是T的部分。
datax其实将transform分成了两类一类是本地(isNative)(转换类自定义在datax中),另一类叫 非本地,非本地转换容许你定义一个transformer.json,从这个json中读取有用信息。本次主要讲本地transfromer的开发?
2.datax 开发transfromer 的环境准备。
首先我们需要下载datax的源码,下载地址:https://github.com/alibaba/DataX
在本地我们还需要准备maven,主要用来打包
开发工具 Idea或Eclipse 及JDK1.8。
下载代码后,导入开发工具,我们需要配置maven库,配置上阿里的镜像,如下:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>;
<mirrorOf>central</mirrorOf>
</mirror>
等到各类依赖包下载齐全后,则可以开发了,这里有个小问题,我也没找到答案,就是导入所有包后,部分源码中打印日志的地方都还是报错,意思是没有识别到sl4j的包,可是我的maven仓库明明存在这个jar包,但是这个报错不影响我们具体的使用。这里问题如果有人研究出来,可以在后面给我解答一下。
这样开发环境就已准备,这里不再赘述,不会可百度。
3.如何开发一个transformer?
我们自己开发的叫自定义 transformer,那么有没有内置的呢?答案是有的,datax内置了5个。如下:
截取SubstrTransformer
填充PadTransformer
替换ReplaceTransformer
过滤FilterTransformer
Groovy类型GroovyTransformer
这五个怎么使用,我们后面单开一篇介绍,这里先略过。下面我们就可以参考内置的transformer去开发我们需要的转换。首先datax中的transform有2个顶级接口,简单类型的Transformer和复杂类型的ComplexTransformer,在 com.alibaba.datax.transport.transformer 路径下。这里我们介绍简单类型的Transformer。
第一步:我们需要定义一个类,去实现Transformer,重写evaluate()方法。具体如下:
代码解释:
dx_idcard 是这个自定义转换的名字,叫什么无所谓,但是要写本地的必须要以dx_ 开头。
columnIndex 是获取json文件中出过来的列索引,即处理第几列的数,这个索引是从 0 开始。
关键逻辑或者更固定写法已框出,其他的代码就是常规写java的方式,既可以自己写逻辑,也可以引入第三方工具类以供使用。
第二步:我们需要将该自定义的transformer 注册到 core\src\main\java\com\alibaba\datax\core\transport\transformer 目录的 TransformerRegistry 类中。
第三步:我们在datax目录下 ,使用maven打包。运行cmd,使用 mvn clean package -DskipTests assembly:assembly命令,完成打包后,会在datax路径下,有个target/datax/datax ,这里的datax就是平常要使用的datax工具了。可以把这里的datax放到windows 或linux上运行了,因为这里把代码都编译成了jar包,只要有jdk的地方都可以使用。
这里我们datax的自定义transformer 就完成了,那下面我们介绍如何使用这个transformer。我们需要再json中配置,如下:
"transformer": [
{
"name": "dx_idcard",
"parameter": {
"columnIndex": 1,
"paras":[""]
}
}
],
这里的name就是我们的自定义transformer的名称,columnIndex表示要处理第几列索引,注意从 0 开始,paras是要传入的参数,这里我不需要,所以是空的。
配置完成后,我们可以在target\datax\datax\bin 下运行cmd (windows环境下),执行命令:python datax.py …\target\datax\datax\job\job.json 。注意后面的路径要换成自己的。