可以借助 DolphinScheduler 调度工具,实现从 Doris 查询联合主键记录并传递到 MySQL 执行删除操作,需要结合 SQL 任务 、Shell 任务 和 参数传递 功能。
以下是具体步骤:
1. 创建工作流并添加 Doris 查询任务
首先添加一个 SQL 任务 查询 Doris 表中的联合主键:
-
任务类型 :选择
SQL
-
数据源:选择已配置的 Doris 数据源
-
SQL 语句 :
sqlSELECT GROUP_CONCAT( CONCAT_WS(',', id1, id2) ,'|' ) AS primary_key -- 联合主键字段用逗号连接 FROM doris_table WHERE condition = 'value'
-
任务名称 :例如
query_doris_pk
-
高级配置 :勾选
将查询结果保存为变量
,变量名设为pk_list
语法解析
-
CONCAT_WS(',', id1, id2)
:- 将联合主键
id1
和id2
用逗号,
连接,例如id1=1
和id2=234
会转为1,234
。
- 将联合主键
-
GROUP_CONCAT(... SEPARATOR '|')
:- 将所有
CONCAT_WS
结果用竖线|
连接,形成最终的一行字符串。 - 例如三条记录会转为
1,234|5,678|9,1011
。
- 将所有
注意事项
-
NULL 值处理
:- CONCAT_WS 会忽略 NULL 值,若主键可能为 NULL,建议先使用 COALESCE 处理:
sqlCONCAT_WS(',', COALESCE(id1, ''), COALESCE(id2, ''))
-
性能优化
:- 大数据量时,GROUP_CONCAT 可能导致内存问题,建议先过滤数据或分批处理。
-
字符集兼容
:- 确保 Doris 表的字符集与后续处理兼容(如 MySQL 的 UTF8 字符集)。
2. 添加 Shell 任务处理结果
添加一个 Shell 任务 处理查询结果,生成 MySQL 删除语句:
-
任务类型 :选择
Shell
-
脚本内容 :
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" 。
- 任务名称 :例如
generate_delete_sql
- 高级配置 :勾选
将脚本输出作为变量
,变量名设为delete_sql
3. 添加 MySQL 执行任务
添加一个 SQL 任务 执行生成的删除语句:
-
任务类型 :选择
SQL
-
数据源:选择已配置的 MySQL 数据源
-
SQL 语句 :
sql${delete_sql}
-
任务名称 :例如
execute_mysql_delete
4. 工作流配置与依赖关系
-
工作流参数:在工作流参数中定义变量:
pk_list = "" delete_sql = ""
-
任务依赖:
query_doris_pk → generate_delete_sql → execute_mysql_delete
5. 验证与优化
-
测试查询:
- 先单独运行
query_doris_pk
任务,检查pk_list
变量是否包含正确的联合主键。
- 先单独运行
-
SQL 安全:
- 如果主键值包含特殊字符,可能需要在 Shell 任务中增加转义处理。
-
批量处理:
- 对于大量数据,可将
pk_list
拆分为多个子任务,避免单条 SQL 过长。
- 对于大量数据,可将
完整工作流示例
+---------------------+ +-------------------------+ +------------------------+
| query_doris_pk | ---> | generate_delete_sql | ---> | execute_mysql_delete |
| (SQL 任务) | | (Shell 任务) | | (SQL 任务) |
| 从 Doris 查询主键 | | 处理结果生成 SQL | | 执行 MySQL 删除 |
+---------------------+ +-------------------------+ +------------------------+
注意事项
-
变量传递限制:
- DolphinScheduler 的变量传递有长度限制(默认 4KB),大量数据可能需要通过文件中转。
-
事务安全:
- 确保 MySQL 表使用 InnoDB 引擎,并在删除前备份数据。
通过以上配置,我们就可以实现从 Doris 查询联合主键并在 MySQL 中删除对应记录的自动化流程。