更新目标表部分字段

  • 文档创建者:Wendy123456
  • 历史版本:1
  • 最近更新:Wendy123456 于 2022-03-17
  • 1. 概述

    1.1 应用场景

    将来源表的数据更新到目标表时,将部分字段进行比对,只更新这些字段的数据。

    1.2 实现思路

    根据比对字段更新目标表指定字段的思路:

    • 来源表有数据新增:目标表中插入新增数据

    • 来源表有数据更新:根据选择的比对字段更新目标表指定字段的数据

    • 来源表有数据删除:删除目标表中的对应的数据

    2. 示例

    2.1 准备数据

    1)数据库 dwTest1 中新建一张表 User_base,作为来源表1,主键是 bid,进行比对的字段是 id,如下图所示:

    2.png

    建表语句如下:

    CREATE TABLE `User_base` (
    `bid` int(11) NOT NULL AUTO_INCREMENT,
      `id` varchar(255) DEFAULT NULL,
        `name` varchar(255) DEFAULT NULL,
        `sex` varchar(255) DEFAULT NULL,
        `age` varchar(255) DEFAULT NULL,
            `degree` varchar(255) DEFAULT NULL,
     PRIMARY KEY (`bid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
     
    INSERT INTO `User_base` VALUES (null'1001''张飞云''male','25','博士');
    INSERT INTO `User_base` VALUES (null'1002''李亮''male','22','学士');
    INSERT INTO `User_base` VALUES (null'1003''王大林''female','24','硕士');
    INSERT INTO `User_base` VALUES (null'1004''刘再清''male','21','学士');
    INSERT INTO `User_base` VALUES (null'1005''马占云''female','20','硕士');
    INSERT INTO `User_base` VALUES (null'1006''曹子云''male','23','博士');
    INSERT INTO `User_base` VALUES (null'1007''刘飞''male','20','学士');
    显示代码

    2)数据库 dwTest1 中新建一张表 User_test,作为来源表2,主键是 tid,进行比对的字段是 id,如下图所示:

    3.png

    建表语句如下:

    CREATE TABLE `User_test` (
    `tid` INT ( 11 ) NOT NULL AUTO_INCREMENT,
    `id` VARCHAR ( 255 ) DEFAULT NULL,
    `time` VARCHAR ( 255 ) DEFAULT NULL,
    `place` VARCHAR ( 255 ) DEFAULT NULL,
    `position` VARCHAR ( 255 ) DEFAULT NULL,
    `level` VARCHAR ( 255 ) DEFAULT NULL,
     PRIMARY KEY (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
     
    INSERT INTO `User_test` VALUES (null'1001','2021-11','无锡','运营专家','3');
    INSERT INTO `User_test` VALUES (null'1002','2021-10','南京','运营专员','1');
    INSERT INTO `User_test` VALUES (null'1003','2020-11','无锡','运营经理','2');
    INSERT INTO `User_test` VALUES (null'1004','2021-10','南京','运营专员','1');
    INSERT INTO `User_test` VALUES (null'1005','2020-09','无锡','运营专家','3');
    INSERT INTO `User_test` VALUES (null'1006','2020-09','南京','运营专家','3');
    INSERT INTO `User_test` VALUES (null'1007','2020-11','无锡','运营经理','2');
    显示代码

    3)数据库 dwTest1 中新建一张表 User_position,作为目标表,主键是 pid,进行比对的字段是 id,如下图所示:

    4.png

    建表语句如下:

    CREATE TABLE `User_position` (
      `pid` int(11) NOT NULL AUTO_INCREMENT,
      `id` varchar(255) DEFAULT NULL,
      `age` varchar(255) DEFAULT NULL,
      `degree` varchar(255) DEFAULT NULL,
      `position` varchar(255) DEFAULT NULL,
      `level` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`pid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8;

    INSERT INTO `User_test` VALUES (null'1001','25','博士','运营专家','3');
    INSERT INTO `User_test` VALUES (null'1002','22','学士','运营专员','1');
    INSERT INTO `User_test` VALUES (null'1003','24','硕士','运营经理','2');
    INSERT INTO `User_test` VALUES (null'1004','21','学士','运营专员','1');
    INSERT INTO `User_test` VALUES (null'1005','20','硕士','运营专家','3');
    INSERT INTO `User_test` VALUES (null'1006','23','博士','运营专家','3');
    INSERT INTO `User_test` VALUES (null'1007','20','学士','运营经理','2');
    显示代码

    2.2 场景模拟

    目标表中保留着来源表上一次更新的数据,而当前来源表已经发生了如下改变:

    • 来源表1-User_base:新增了1008陈飞宇的数据

    • 来源表1-User_base:删除了1004刘再清的数据

    • 来源表2-User_test:新增了1008陈飞宇的数据

    • 来源表2-User_base:删除了1004刘再清的数据

    • 来源表2-User_test:1001、1006的 position 和 level 的数据发生变化

    2.3 整体流程

    实现上述场景的 ETL 整体流程如下:

    5.png

    2.4 实现步骤

    2.4.1 来源表1数据删除

    1)创建一个 ETL 任务,将一个参数赋值节点拖到设计界面,并重命名为获取来源表1的比对字段ID

    点击该节点,如下图设置数据来源,SQL 语句的作用是:获取来源表1中所有 ID 数据。

    6.png

    SQL 语句如下:

    -- 获取来源表1中ID的所有值
    SELECT id FROM User_base

    2)将取出来的 ID 输出为参数,如下图所示:

    7.png

    3)将一个SQL脚本节点拖到设计界面,并重命名为根据来源表1删除目标表数据,用线条跟上游获取来源表1的比对字段ID」节点连起来。

    点击该节点,如下图设置,SQL 语句的作用是将目标表中存在但来源表1中没有的数据删除掉。

    8.png

    SQL 语句如下:

    -- 筛除出目标表中存在但是来源表不存在的ID,将该ID对应的数据行删除
    delete from  User_position
    where  id  not in (${User_base_id}) 

    2.4.2 来源表2数据删除

    1)创建一个 ETL 任务,将一个参数赋值节点拖到设计界面,并重命名为获取来源表2的比对字段ID

    点击该节点,如下图设置数据来源,SQL 语句的作用是:获取来源表2中所有 ID 数据。

    9.png

    SQL 语句如下:

    -- 获取来源表2中ID的所有值
    SELECT id FROM User_test

    2)将取出来的 ID 输出为参数,如下图所示:

    10.png

    3)将一个SQL脚本节点拖到设计界面,并重命名为根据来源表2删除目标表数据,用线条跟上游获取来源表2的比对字段ID」节点连起来。

    点击该节点,如下图设置,SQL 语句的作用是将目标表中存在但来源表2中没有的数据删除掉。

    11.png

    SQL 语句如下:

    -- 筛除出目标表中存在但是来源表不存在的ID,将该ID对应的数据行删除
    delete from  User_position
    where  id  not in (${User_test_id}) 

    2.4.3 新增和更新数据

    1)将一个数据同步节点拖到设计界面,并重命名为更新目标表的年龄和学位字段,用线条跟上游根据来源表2删除目标表数据」节点连起来。

    点击该节点,数据来源如下图设置,SQL 语句的作用是获得来源表1的所有数据。

    12.png

    SQL 语句如下:

    SELECT * from User_base

    2)设置数据去向,将数据保存到目标表里,需要设置 id 为比对字段,更新策略为覆盖,如下图所示:

    13.png

    3)字段映射采用同名映射,且使用编辑映射删掉无关的映射字段,只保留 id、age、degree 这三个字段的映射关系。

    14.png

    4)将一个数据同步节点拖到设计界面,并重命名为更新目标表的职位和职级字段,用线条跟上游更新目标表的年龄和学位字段」节点连起来。

    点击该节点,数据来源如下图设置,SQL 语句的作用是获得来源表2的所有数据。

    15.png

    SQL 语句如下:

    select * from User_test

    5)设置数据去向,将数据保存到目标表里,需要设置 id 为比对字段,更新策略为覆盖,如下图所示:

    16.png

    6)字段映射采用同名映射,且使用编辑映射删掉无关的映射字段,只保留 id、position、level 这三个字段的映射关系。

    17.png

    2.5 运行任务

    2.2 节里面的数据变化在来源表中发生后,执行该 ETL 任务,最终目标表的结果如下图所示:

    可以看到 1001 和 1006 的 position 和 level 都更新了,1004 那行数据被删除,新增了一条 1008 的数据

    18.png

    附件列表


    主题: 数据开发-定时任务
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!