上一篇博客介绍了本次操作的一些需求和预研思路,并且对第一种方式做了测试,现在将对第二种方式做测试。虽然在网上有不少关于动态链接库的文章,但是不少是操作kettle文件,或者通过脚本去按照一定规则生成变量。好像并不是很适合我自己的任务思路,因此在借鉴他们的思路的基础上,通过多次测试,终于走通了动态链接数据源的数据抽取,为了方便一步一步的递进,本次选择了一个数据较少的表来测试,具体步骤详见下文。
(1)单个数据源多表批量操作:每次只连接一个数据源,把表名作为变量,维护一个任务抽取一个用户节点的所有数据
(2)多个数据源单标批量操作:动态链接多个数据源,每个数据源只对一个表做数据抽取
(3)多个数据源多表批量操作:动态链接多个数据源,每个数据源所有表做数据抽取
1.1 持久化数据源信息
因为我们要做批量数据源的数据迁徙,因此可以将多个数据库的数据源链接信息先保存在表里,或者保存在其他形式的文件里,方便我们去到数据。为了后续扩展方便,管理方便,我将数据源链接信息放在表里。同时为了能一条一条的取出数据源,我定义了一个标志字段id,可以通过这个id来获取一条条的记录。持久化信息如下:
CREATE TABLE "public"."t_cce_jdbc" (
"id" varchar(100) COLLATE "default",
"jdbc_name" varchar(255) COLLATE "default",
"jdbc_host" varchar(255) COLLATE "default",
"jdbc_username" varchar(255) COLLATE "default",
"jdbc_pasword" varchar(255) COLLATE "default",
"jdbc_database" varchar(255) COLLATE "default",
"jdbc_port" varchar(10) COLLATE "default")
WITH (OIDS=FALSE)
1.2 设置数据库链接id为变量
1) 新建一个transfer,命名为getIds,包含三个步骤如图所示:
2) 设置表输入的数据库源设置
3) 设置表输入的获取数据脚本,这里就是从持久化的数据中获取到数据,为了后续的每次执行一条数据库脚本,这里就先把id获取出来,左后后续获取数据库链接的一个参数。
4) 将设置选择字段,因为这里只有一个id字段,因此只要列一个字段即可,暂时将其设置为id_param
5) 将三个步骤联结起来,完成单钱transfer的操作,如下图
1.3 获取数据库链接id信息
1) 新建transfer,命名为setIdparam,包含如下两个步骤
2) 设置从结果获取的记录,将上一个保存到结果的数据拿出来
3) 将获取的记录结果保存到变量中,并将变量名统一改为大写ID_PARAM
4) 将两个步骤联结起来,并保存
1.4 设置数据库链接信息为结果
1) 新建transfer,命名为getJDBC,包含三个步骤,如下图:
2) 设置数据库链接,这里的链接跟获取id的链接是一样的,如下图:
3) 设置数据库脚本,根据上一步的ID参数获取每一次要获取的数据库链接,注意要勾选上允许替换SQL中的变量
4) 设置选择字段,根据上一个脚本查出来的字段,选择将要设置为变量的字段,并加上一个参数标识。
5) 设置变量将选取的字段设置为变量
6) 将三个步骤联结起来并保存
1.5 抽取数据库数据
1) 新建transfer命名为getDatas,包含两个步骤,如下图所示:
2) 设置表输入的数据库链接,因为这里的数据库链接是从上一个的变量找那个获取,因此这里的链接信息基本上都是用变量代替,如下图所示:
3) 设置数据库抽取脚本,这里只用一个表做抽取,如下图所示:
4) 设置表输出的目标链接信息,如下图所示:
5) 设置目标表,根据上一步设置的表输入的脚本中表名,选择目标表
6) 将两个步骤链接,保存。
1.6 建立数据库抽取子Job
1) 新建Job,命名为jobData,包含如下三个步骤:
2) 设置第一个转换,从文件中选择之前步骤设置的setIdParam绑定,如下图:
3) 设置第二个转换,从文件中获取之前的步骤setJDBC绑定,如下图:
4) 设置第三个转换,从文件中获取之前设置的getDatas绑定,如下图
5) 连接三个步骤,并保存,如下图
1.7 建立数据库抽取整个Job
1) 新建一个job,命名为jobAll,包含如下三个步骤
2) 设置第一个转换,从文件中选择前面设置的getIds绑定,如下图所示:
3) 设置子job,选择之前步骤设置的jobDatas绑定,并在高级中勾选每个输入执行一次,如下图所示:
4) 链接job中的所有步骤,并保存。
1.8 执行任务并查看结果
数据源1数据:22条
数据源2数据:54条
执行后目标库数据:76条
通过实验可以发现两个数据源的数据都已入库。