配置映射规则
概述
本节主要提供数据集成任务映射规则的配置说明。可以通过配置ROMA Connect源端数据字段到目标端数据字段的映射规则,把获取到的源端数据转换成写入目标端的数据。规则映射有映射模式和脚本模式两种模式,其中映射模式包含自动配置和手动配置两种方式。
源端与目标端字段名请勿使用对应数据库的关键字,否则可能导致任务运行异常。
映射模式
- 自动配置Mapping
若源端信息与目标端信息中都定义了元数据,可使用“自动Mapping”方式配置Mapping信息。
单击“自动Mapping”,源端和目标端数据字段间的映射规则自动建立。
源端或目标端数据类型为API时,数据字段不支持自动Mapping,需要手动配置Mapping。
图1 自动Mapping
- 手动配置Mapping
如果两端的数据表字段不一致,可单击下方的“添加mapping映射”,配置源端数据字段到目标端数据字段的映射关系。
用户可以手动添加源端数据字段与目标端数据字段的映射规则,该方式适用于所有数据类型的集成场景。可以通过键值对输入或文本框输入两种方式配置Mapping映射规则。
脚本模式
可通过编辑JavaScript脚本来配置源端数据(sourceObj指源表的字段集合对象)和目标端数据(targetObj指目标表的字段集合对象)的Mapping映射关系信息,增强复杂对象的Mapping处理能力。
脚本映射样例:
- 样例模板。
function excute(sourceObj){ //请在此处编写脚本内容, 注意大小写敏感。 //定义目标端数据对象 targetObj = {}; //支持普通的加减乘除运算 targetObj.a= (sourceObj.id * 3 + 1) % 5; //支持js的Math函数 targetObj.b= Math.sqrt(100); //支持类型转换 targetObj.c = Number("3.14"); //支持调用系统的时间函数 targetObj.date = new Date().toLocaleString(); //支持正则表达式 targetObj.fdi = sourceObj.name.replace(/world/i,"fdi"); //支持json转换 var json = JSON.parse(sourceObj.infoJson); targetObj.address = json.address; targetObj.age = json.age; targetObj.sex = json.other.sex; targetObj.hobby = json.other.hobby; //支持条件语句 if(targetObj.hobby == "rap"){ targetObj.ikun = true; }else{ targetObj.ikun = false; } return targetObj; }
- 仅字段映射。
function excute(sourceObject) {//sourceObject即源端传送的数据对象 //请在此处编写脚本内容; var targetObject = {}; targetObject.mqs_id = sourceObject.id;//映射源端数据表中的id字段至目标端字段mqs_id targetObject.mqs_name = sourceObject.name; targetObject.mqs_date = sourceObject.date; targetObject.mqs_date = sourceObject['customized-outdutydate'];//属性带中划线的字段,需要使用中括号进行引用 return targetObject; //targetObject即返回给目标端的数据对象 }
- 目标端数据源类型为API。
API数据类型的目标端需要分别使用三个对象进行传递,对象包含params、headers和body。
function excute(sourceObj) { print("execute js"); print(sourceObj); var targetObj = {}; targetObj.params = {}; targetObj.params.id = sourceObj.uid targetObj.headers = {}; targetObj.headers['X-HW-ID'] = "应用ID"; targetObj.headers['X-HW-APPKEY'] = "应用密钥"; targetObj.body = {}; return obj; }
如果转换的数据存在时间类型。则JS脚本中需参考以下加黑字段修改:编排模式下,目标端数据源类型为API,且使用JS脚本进行数据转换时,会自动先将源端类型为Date的数据类型转换为yyyy-MM-dd HH:mm:ss的字符串类型。例如,源端时间数据为19:55:20,通过JS脚本转换后会变为1970-01-01 19:55:20,而不是预期的19:55:20。其中1970-01-01为系统统一添加的默认值。
如果要目标端要获得指定格式的数据,需要参考下述示例在JS脚本中对时间数据进行转换。
function excute(sourceObj) { /** * 自定义时间格式函数 * @param {format} 时间显示格式 */ Date.prototype.format = function (format) { var date = { "M+": this.getMonth() + 1, "d+": this.getDate(), "h+": this.getHours(), "m+": this.getMinutes(), "s+": this.getSeconds(), "q+": Math.floor((this.getMonth() + 3) / 3), "S": this.getMilliseconds() }; if (/(y+)/i.test(format)) { format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)); } for (var k in date) { if (new RegExp("(" + k + ")").test(format)) { format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ("00" + date[k]).substr(("" + date[k]).length)); } } return format; }; print("execute js"); print(sourceObj); var targetObj = {}; targetObj.params = {}; targetObj.params.id = sourceObj.uid //对时间格式的数据进行转换时,调用上述自定义的函数进行处理, 抽取时、分、秒部分的数据给目标字段。 //其中下述代码中的HH:mm:ss为时分秒时间的显示格式。如果写为hhmmss,则返回给目标字段的格式不带冒号。 targetObj.params.time = (new Date(sourceObj.time)).format("hh:mm:ss"); targetObj.headers = {}; targetObj.headers['X-HW-ID'] = "应用ID"; targetObj.headers['X-HW-APPKEY'] = "应用密钥"; targetObj.body = {}; return obj; }
- 数据库字段涉及多层json解析。
如果源端数据对象包含的字段涉及多层json对象嵌套,则需要对每一个解析出来的字段使用“[]”引用。
例如如下脚本表示root字段包含id、name、double等多层对象嵌套,则每一个解析的字段需要单独引用。
function excute(sourceObject) { //请在此处编写脚本内容; var targetObject = {}; targetObject.mqs_id = sourceObject["root.id"]; targetObject.mqs_name = sourceObject["root.name"]; targetObject.mqs_double = sourceObject["root.double"]; targetObject.mqs_date = sourceObject["root.date"]; targetObject.mqs_boolean = sourceObject["root.boolean"]; targetObject.mqs_timestamp = sourceObject["root.timestamp"]; targetObject.mqs_time = sourceObject["root.time"]; targetObject.mqs_long = sourceObject["root.long"]; return targetObject; }