系列文章目录
文章目录
前言
Kettle是一款开源的大数据ETL工具,功能很强大,但功能也很复杂;相应的网上也有很多基础教程和ETL的Blogs,此处不在赘述。
本文主要记录工作中的一次使用Kettle进行同步数据到Mysql的实施过程。
一、总体流程
- 涉及2个工作流、4个转换算子:
- 主工作流:串联全流程
- 子工作流:执行单表同步流程
- 转换一:从指定表中获取所有需要同步的原表及对应的目标表
- 转换二:设置原表名、目标表名到环境变量中
- 转换三:根据原表的ddl生成目标表的ddl,并保存到环境变量中
- 转换四:从原表中读取数据写入到目标表
二、详细设计
1. 转换一:读取ETL表配置
从指定的表中查询需要迁移的所有表配置,可以从表、导入文件等等多种途径进行配置。
从配置中读取迁移配置的目的在于过滤,因为sqlserver可能存在系统表中记录有临时表,但是该session没有办法查询到临时表的ddl。
- etl_job_config:从指定的表中查询需要迁移的表
- collect:过滤需要的字段source_id、target_id
- copy rows to result:将查询结果写入到result中
-- etl_job_config
SELECT
id
, job_id
, source_id
, target_id
, source_config_id
, target_config_id
FROM dbo.etl_job_config
where is_pull = 0
2. 转换二:表配置写入环境变量
从转换一中写入结果中读取信息,写入到环境变量中
source_id -> SOURCE_ID
target_id -> TARGET_ID
3. 转换三:生成DDL
根据source_id,通过sql拼接出目标表的ddl,并将ddl预计写入到环境变量“DDL”
使用表输入进行脚本查询输出,SQL节点只能用于DDL执行,不会返回结果。
declare @table varchar(100) = '${SOURCE_ID}'
declare @sql table(s varchar(1000), id int identity)
-- 创建语句
insert into @sql(s) values ('create table if not exists ${TARGET_ID} (')
-- 获取注释
SELECT A.name AS table_name,
B.name AS column_name,
C.value AS column_description
into #columnsproperties
FROM sys.tables A
INNER JOIN sys.columns B ON B.object_id =<