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)

    • 将联合主键 id1id2 用逗号 , 连接,例如 id1=1id2=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数组就会包含三个元素,RECORDS[0]为 "a" ,RECORDS[1]为 "b" ,RECORDS[2]为 "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 中删除对应记录的自动化流程。

相关推荐
cg.family3 小时前
Doirs Routine Load
doris·routine load
MyFreeIT5 小时前
MySQL Function
数据库·mysql
白鹭5 小时前
MySQL主从复制进阶(GTID复制,半同步复制)
linux·运维·数据库·mysql·集群
叫我Zoe就行5 小时前
MySQL集群——主从复制
linux·数据库·学习·mysql
叫我龙翔6 小时前
MySQL】从零开始了解数据库开发 --- 表的操作
数据库·mysql·数据库开发
叫我龙翔6 小时前
【MySQL】从零开始了解数据库开发 --- 初步认识数据库
数据库·mysql·数据库开发
周杰伦的稻香7 小时前
MySQL抛出的Public Key Retrieval is not allowed
数据库·mysql
Hx__8 小时前
MySQL InnoDB 的锁机制
数据库·mysql
理智的煎蛋14 小时前
MySQL高可用架构:MHA
linux·数据库·mysql·架构·可用性测试
KING BOB!!!17 小时前
Leetcode高频 SQL 50 题(基础版)题目记录
sql·mysql·算法·leetcode