更新时间:2023-03-01 GMT+08:00

配置映射规则

概述

本节主要提供数据集成任务映射规则的配置说明。可以同过配置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; 
     }