Doris与DS结合实现MySQL侧的Upsert功能

可以借助 DolphinScheduler 调度工具,实现从 Doris 查询联合主键记录并传递到 MySQL 执行删除操作,需要结合 SQL 任务 、Shell 任务 和 参数传递 功能。

以下是具体步骤:

1. 创建工作流并添加 Doris 查询任务

首先添加一个 SQL 任务 查询 Doris 表中的联合主键:

  1. 任务类型 :选择 SQL

  2. 数据源:选择已配置的 Doris 数据源

  3. SQL 语句 :

    sql 复制代码
    SELECT 
        GROUP_CONCAT(
            CONCAT_WS(',', id1, id2) 
            ,'|'
        ) AS primary_key  -- 联合主键字段用逗号连接
    FROM doris_table
    WHERE condition = 'value'
  4. 任务名称 :例如 query_doris_pk

  5. 高级配置 :勾选 将查询结果保存为变量,变量名设为 pk_list

语法解析

  1. CONCAT_WS(',', id1, id2):

    • 将联合主键 id1 和 id2 用逗号 , 连接,例如 id1=1 和 id2=234 会转为 1,234。
  2. GROUP_CONCAT(... SEPARATOR '|'):

    • 将所有 CONCAT_WS 结果用竖线 | 连接,形成最终的一行字符串。
    • 例如三条记录会转为 1,234|5,678|9,1011。

注意事项

  1. NULL 值处理:

    • CONCAT_WS 会忽略 NULL 值,若主键可能为 NULL,建议先使用 COALESCE 处理:
    sql 复制代码
    CONCAT_WS(',', COALESCE(id1, ''), COALESCE(id2, ''))
  2. 性能优化:

    • 大数据量时,GROUP_CONCAT 可能导致内存问题,建议先过滤数据或分批处理。
  3. 字符集兼容:

    • 确保 Doris 表的字符集与后续处理兼容(如 MySQL 的 UTF8 字符集)。

2. 添加 Shell 任务处理结果

添加一个 Shell 任务 处理查询结果,生成 MySQL 删除语句:

  1. 任务类型 :选择 Shell

  2. 脚本内容 :

    bash 复制代码
    # 读取 Doris 查询结果
    PK_LIST="${pk_list}"
    
    # 生成 MySQL 删除语句
    DELETE_SQL="DELETE FROM mysql_table WHERE (id1, id2) IN ("
    
    # 处理每条记录
    IFS='|' read -ra RECORDS <<< "$PK_LIST"
    for RECORD in "${RECORDS[@]}"; do
        # 分割联合主键
        IFS=',' read -ra KEYS <<< "$RECORD"
        DELETE_SQL+="('${KEYS[0]}','${KEYS[1]}'),"
    done
    
    # 移除最后一个逗号并闭合括号
    DELETE_SQL="${DELETE_SQL%,}"
    DELETE_SQL+=");"
    
    # 输出结果供下游任务使用
    echo "DELETE_SQL=${DELETE_SQL}"

代码解析:

(1) IFS='|' read -ra RECORDS <<< "$PK_LIST"

这是一段在 Shell 脚本中的命令。具体含义为:首先将内部字段分隔符(IFS)设置为竖线 "|" ,这意味着在后续读取操作中,竖线将作为字段分隔标识。然后使用read命令结合-ra选项来读取数据,-r选项使得读取时不把反斜杠作为转义字符,-a选项用于将读取到的数据赋值给一个数组。RECORDS是定义的数组名。<<< "$PK_LIST"表示从变量PK_LIST的值中读取内容,将按照竖线分隔后的数据填充到RECORDS数组中。例如,若PK_LIST的值为 "a|b|c",那么RECORDS数组就会包含三个元素,RECORDS0为 "a" ,RECORDS1为 "b" ,RECORDS2为 "c" 。

  1. 任务名称 :例如 generate_delete_sql
  2. 高级配置 :勾选 将脚本输出作为变量,变量名设为 delete_sql

3. 添加 MySQL 执行任务

添加一个 SQL 任务 执行生成的删除语句:

  1. 任务类型 :选择 SQL

  2. 数据源:选择已配置的 MySQL 数据源

  3. SQL 语句 :

    sql 复制代码
    ${delete_sql}
  4. 任务名称 :例如 execute_mysql_delete

4. 工作流配置与依赖关系

  1. 工作流参数:在工作流参数中定义变量:

    复制代码
    pk_list = ""
    delete_sql = ""
  2. 任务依赖:

    复制代码
    query_doris_pk → generate_delete_sql → execute_mysql_delete

5. 验证与优化

  1. 测试查询:

    • 先单独运行 query_doris_pk 任务,检查 pk_list 变量是否包含正确的联合主键。
  2. SQL 安全:

    • 如果主键值包含特殊字符,可能需要在 Shell 任务中增加转义处理。
  3. 批量处理:

    • 对于大量数据,可将 pk_list 拆分为多个子任务,避免单条 SQL 过长。

完整工作流示例

复制代码
+---------------------+      +-------------------------+      +------------------------+
| query_doris_pk      | ---> | generate_delete_sql     | ---> | execute_mysql_delete   |
| (SQL 任务)          |      | (Shell 任务)            |      | (SQL 任务)             |
| 从 Doris 查询主键    |      | 处理结果生成 SQL        |      | 执行 MySQL 删除        |
+---------------------+      +-------------------------+      +------------------------+

注意事项

  1. 变量传递限制:

    • DolphinScheduler 的变量传递有长度限制(默认 4KB),大量数据可能需要通过文件中转。
  2. 事务安全:

    • 确保 MySQL 表使用 InnoDB 引擎,并在删除前备份数据。

通过以上配置,我们就可以实现从 Doris 查询联合主键并在 MySQL 中删除对应记录的自动化流程。

相关推荐
这个DBA有点耶32 分钟前
云数据库半夜卡顿,CPU才30%?深挖云盘IOPS突发限制与内核挂起机制
数据库·mysql·云原生
xixingzhe24 小时前
MySQL 锁表故障排查与处理
数据库·mysql
真上帝的左手4 小时前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis
为思念酝酿的痛5 小时前
MySQL表的连接
数据库·mysql
bksczm5 小时前
MySQL之存储引擎
数据库·mysql
计算机毕设定制辅导-无忧学长6 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
Decay__7 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
雪芽蓝域zzs7 小时前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
余槐i8 小时前
Spring Boot 3.2 偶发500无日志:线程池复用导致请求上下文丢失
spring boot·redis·后端·mysql·性能优化
孤狼GPT9 小时前
ChatGPT、Codex数据库实战:MyBatis-Plus第一页查询正常,翻到第10000页为什么越来越慢?
mysql·chatgpt·mybatis-plus·codex·深分页