在实施etl过程中,经常会遇到不同类型之间的转换,方式有很多种,下面是项目中使用etl-engine进行数据类型转换的收集整理,方便日后工作中查阅。
etl-engine转换的方式有多种,一种是通过sql语句直接转换(比较方便),另一种是通过在输出节点的beforeout 标签中嵌入go脚本对相应字段按业务要求进行转换(功能强大),下面只介绍第一种情况。
元数据Metadata配置说明
元数据文件定义目标数据格式(如输出节点中定义的renameOutputFields或renameOutputTags所对应的字段名称及字段类型) outputFields是输入节点中数据结果集中的字段名称, 将outputFields定义的字段转换成renameOutputFields定义的字段,其renameOutputFields转换格式通过元数据文件来定义。
属性 | 说明 | 适合 |
id | 唯一标示 | |
field | ||
name | 输出数据源的字段名称 | renameOutputFields, renameOutputTags |
type | 输出数据源的字段类型 | string,int,int32,float, str_timestamp,decimal, datetime,timestamp,bool,blob |
default | 默认值 | 当nullable为false时,如果输出值为空字符串,则可以通过default来指定输出的默认值 |
nullable | 是否允许为空 | false是不允许为空,必须和default配合使用。true是允许为空。 通过增加一个field并设置nullable为true可以实现增加字段功能。 |
errDefault | 如果输入数据向输出数据类型转换失败时,是否启动默认值 | 如果设置值,则转换出错时也能向下执行,即出错的值使用该默认值, 如果不设置该值,则转换出错时不能向下执行。 |
dataFormat | 对日期输出格式的配置 | string -> datetime 或 datetime -> string 需要配置日期格式 日期格式配置如: YYYY-MM-DD hh:mm:ss 或YYYY-MM-DD hh:mm:ssZ+8h |
dataLen | 对小数位格式的配置 | string -> decimal 格式设置输出数字小数点位数,代表保留小数点后几位 ; 或 输出string类型时 格式设置代表输出内容的总长度 |
样本
mysql
字符串类型 转换 日期类型
源数据库 | 字符串string | 目标数据库 | 日期datetime |
mysql | 2023-01-01 10:11:12 | mysql | 元数据输出字段无需特殊配置 type="datetime" |
mysql | 2023-01-01 10:11:12 | sqlserver | 元数据输出字段无需特殊配置 type="datetime" |
mysql | 2023-01-01 10:11:12 | postgres | 元数据输出字段无需特殊配置 type="datetime" |
mysql | 2023-01-01 10:11:12 | oracle | 元数据输出字段无需特殊配置 type="datetime" |
日期类型 转换 字符串类型
源数据库 | 日期datetime | 目标数据库 | 字符串string |
mysql | 2023-01-01 10:11:12 | mysql | 元数据输出字段无需特殊配置 type="string" |
mysql | 2023-01-01 10:11:12 | sqlserver | 元数据输出字段无需特殊配置 type="string" |
mysql | 2023-01-01 10:11:12 | postgres | 元数据输出字段无需特殊配置 type="string" |
mysql | 2023-01-01 10:11:12 | oracle | 元数据输出字段无需特殊配置 type="string" |
日期类型 转换 日期类型
源数据库 | 日期datetime | 目标数据库 | 日期datetime |
mysql | 2023-01-01 10:11:12 | mysql | 元数据输出字段无需特殊设置 type="datetime" 有的情况需要配置+8小时 dataFormat="YYYY-MM-DD hh:mm:ssZ+8h" dataLen="19" |
mysql | 2023-01-01 10:11:12 | sqlserver | 元数据输出字段无需特殊设置 type="datetime" |
mysql | 2023-01-01 10:11:12 | postgres | 元数据输出字段无需特殊设置 type="datetime" |
mysql | 2023-01-01 10:11:12 | oracle | 元数据输出字段无需特殊设置 type="datetime" |
mysql样本表
sqlserver
字符串类型 转换 日期类型
源数据库 | 字符串string | 目标数据库 | 日期datetime |
sqlserver | 2023-01-01 10:11:12 | mysql | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DD hh:mm:ssZ+8h" dataLen="19" |
sqlserver | 2023-01-01 10:11:12 | sqlserver | 元数据输出字段设置 type="datetime" |
sqlserver | 2023-01-01 10:11:12 | postgres | 元数据输出字段设置 type="datetime" |
sqlserver | 2023-01-01 10:11:12 | oracle | 元数据输出字段设置 type="datetime" |
日期类型 转换 字符串类型
源数据库 | 日期datetime | 目标数据库 | 字符串string |
sqlserver | 2023-01-01 10:11:12.000 | mysql | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DDThh:mm:ssZ+8h" dataLen="19" |
sqlserver | 2023-01-01 10:11:12.000 | sqlserver | 源数据查询语句中将日期字段如:f5 通过conver函数转换成YYYY-MM-DD HH:MI:SS格式 CONVERT(VARCHAR, f5, 120) as f5,元数据输出字段设置 type="string" |
sqlserver | 2023-01-01 10:11:12.000 | postgres | 源数据查询语句中将日期字段如:f5 通过conver函数转换成YYYY-MM-DD HH:MI:SS格式 CONVERT(VARCHAR, f5, 120) as f5,元数据输出字段设置 type="string" |
sqlserver | 2023-01-01 10:11:12.000 | oracle | 源数据查询语句中将日期字段如:f5 通过conver函数转换成YYYY-MM-DD HH:MI:SS格式 CONVERT(VARCHAR, f5, 120) as f5,元数据输出字段设置 type="string" |
日期类型 转换 日期类型
源数据库 | 日期datetime | 目标数据库 | 日期datetime |
sqlserver | 2023-01-01 10:11:12.000 | sqlserver | 元数据输出字段设置 type="string" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
sqlserver | 2023-01-01 10:11:12.000 | mysql | 元数据输出字段设置 type="string" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
sqlserver | 2023-01-01 10:11:12.000 | postgres | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
sqlserver | 2023-01-01 10:11:12.000 | oracle | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
日期类型转换字符串类型样本
postgres
字符串类型 转换 日期类型
源数据库 | 字符串string | 目标数据库 | 日期datetime |
postgres | 2023-01-01 10:11:12 | mysql | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DD hh:mm:ssZ+8h" dataLen="19" |
postgres | 2023-01-01 10:11:12 | sqlserver | 元数据输出字段设置 type="datetime" |
postgres | 2023-01-01 10:11:12 | postgres | 元数据输出字段设置 type="datetime" |
postgres | 2023-01-01 10:11:12 | oracle | 元数据输出字段设置 type="datetime" |
日期类型 转换 字符串类型
源数据库 | 日期datetime | 目标数据库 | 字符串string |
postgres | 2023-01-01 10:11:12.000 | mysql | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD HH:MI:SS格式,并加8小时 to_char(f5 + INTERVAL '8 hours', 'YYYY-MM-DD HH24:MI:SS') as f5 ,元数据输出字段设置 type="string" |
postgres | 2023-01-01 10:11:12.000 | sqlserver | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD HH:MI:SS格式,to_char(f5 , 'YYYY-MM-DD HH24:MI:SS') as f5 ,元数据输出字段设置 type="string" |
postgres | 2023-01-01 10:11:12.000 | postgres | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD HH:MI:SS格式,to_char(f5 , 'YYYY-MM-DD HH24:MI:SS') as f5 ,元数据输出字段设置 type="string" |
postgres | 2023-01-01 10:11:12.000 | oracle | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD HH:MI:SS格式,to_char(f5 , 'YYYY-MM-DD HH24:MI:SS') as f5 ,元数据输出字段设置 type="string" |
日期类型 转换 日期类型
源数据库 | 日期datetime | 目标数据库 | 日期datetime |
postgres | 2023-01-01 10:11:12.000 | mysql | 元数据输出字段设置 type="string" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
postgres | 2023-01-01 10:11:12.000 | sqlserver | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
postgres | 2023-01-01 10:11:12.000 | postgres | 元数据输出字段设置 type="string" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
postgres | 2023-01-01 10:11:12.000 | oracle | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DDThh:mm:ss" dataLen="19" |
oracle
字符串类型 转换 日期类型
源数据库 | 字符串string | 目标数据库 | 日期datetime |
oracle | 2023-01-01 10:11:12 | mysql | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DD hh:mm:ssZ+8h" dataLen="19" 注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |
oracle | 2023-01-01 10:11:12 | sqlserver | 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DD hh:mm:ss" dataLen="19" 注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |
oracle | 2023-01-01 10:11:12 | postgresql | 元数据输出字段设置 type="datetime" 注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |
oracle | 2023-01-01 10:11:12 | oracle | 元数据输出字段设置 type="datetime"注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |
日期类型 转换 字符串类型
源数据库 | 日期datetime | 目标数据库 | 日期string |
oracle | 2023-01-01 10:11:12.000 | mysql | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式, to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5,元数据输出字段设置 type="string" |
oracle | 2023-01-01 10:11:12.000 | sqlserver | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式, to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5,元数据输出字段设置 type="string" |
oracle | 2023-01-01 10:11:12.000 | postgresql | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式, to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5,元数据输出字段设置 type="string" |
oracle | 2023-01-01 10:11:12.000 | oracle | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式, to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5,元数据输出字段设置 type="string" |
日期类型 转换 日期类型
源数据库 | 日期datetime | 目标数据库 | 日期datetime |
oracle | 2023-01-01 10:11:12.000 | mysql | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式, to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5,元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DD hh:mm:ssZ+8h" dataLen="19" (这里加了8小时) 注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |
oracle | 2023-01-01 10:11:12.000 | sqlserver | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式,to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5, 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DD hh:mm:ss" dataLen="19" 注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |
oracle | 2023-01-01 10:11:12.000 | postgres | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式,to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5, 元数据输出字段设置 type="datetime" dataFormat="YYYY-MM-DD hh:mm:ss" dataLen="19" 注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |
oracle | 2023-01-01 10:11:12.000 | oracle | 源数据查询语句中将日期字段如:f5 通过to_char函数转换成YYYY-MM-DD hh24:mi:ss格式,to_char(F5,'YYYY-MM-DD hh24:mi:ss') AS F5, 元数据输出字段设置 type="datetime"注意:由于oracle字段名称读出来是大写,因此要注意sql语句中字段大写,outputFields属性要设置大写,如outputFields="F1;F2;F3;F4;F5",否则读不出数据 |