当前位置: 首页 > news >正文

flinkSql的delete语句

问题背景

现场反馈:使用 FlinkSQL 执行包含复杂子查询条件的 DELETE 语句时,无法删除置表中的数据。

环境信息:

  • flink1.19.0
  • StarRocks 版本:3.5.0-10d7323
  • JDBC 驱动版本:8.0.33

问题 SQL 示例:

-- 查看版本 SELECT current_version(); SELECT @@version; -- 无法生效的删除语句(含复杂子查询) DELETE FROM `starrocks~dispatch`.`dispatch`.`ods_tm_station_line_info` WHERE (`line_no`, `is_up_down`,`station_id`, `label_no`) NOT IN ( SELECT `LINE_NO`, `IS_UP_DOWN`, `STATION_ID`, `LABEL_NO` FROM `dispatch`.`orclgps`.`TMGPS.TM_STATION_LINE_INFO` );
排查过程
  1. 使用简单条件(如 WHERE id = 1)执行 DELETE,可正常删除。
  2. 使用函数或复杂子查询条件执行 DELETE,操作不生效。
  3. 通过代码追踪,定位到 Flink 执行删除时的关键判断逻辑。
  4. 查阅 Flink 官方文档,确认 DELETE 语句的语法约束
    HTTPS://nightlies.apache.org/flink/flink-docs-release-1.19/zh/docs/dev/table/SQL/delete/
问题分析
  • 核心原因:Flink 的删除下推(Delete PushDown) 功能对 WHERE 条件表达式有严格限制,仅支持简单的、可下推的表达式。
  • 关键代码逻辑(位于 SqlNodeToOperationConversion.convertDelete())
// 仅当 WHERE 条件为简单表达式时,才会生成 filters Optional<List<ResolvedExpression>> filters = DeletePushDownUtils.getResolvedFilterExpressions(tableModify); // 只有 filters 存在且目标连接器支持,才会进入删除下推流程 if (filters.isPresent() && supportsDeletePushDownSink.applyDeleteFilters(filters.get())) { return new DeleteFromFilterOperation(...); // 触发删除下推 }
  • 问题根因:当 DELETE 语句使用如 NOT IN (SELECT …) 这类复杂子查询时,Flink 无法将其解析为可下推的简单表达式(filters 为空),因此无法生成 DeleteFromFilterOperation,导致删除下推机制未被触发,最终删除操作不生效。
解决方案

经过对问题的深入分析和排查,提出一下解决方案:

首选方案:改写 SQL,满足下推条件

遵循 FlinkSQL 删除下推的语法约束,将复杂子查询条件改写为简单的使用常量值的表达式组合。

  • 语法约束
    • 允许的谓词:=, <, <=, >, >=, <>, OR, AND, LIKE, IS NULL, IS NOT NULL, [NOT] IN
    • 字段要求:必须使用 DDL 中定义的物理字段名。
    • 值的要求:必须为常量值。
    • 执行模式:仅支持批处理(Batch)模式。

备选方案:使用其他执行途径

若删除条件确实无法简化以满足下推要求,可考虑:

  1. 使用新版调度系统单独运行删除任务。
  2. 或通过其他可直接执行复杂表达式删除的工具操作。
解决效果

根据上述解决方案调整后:

  • 改写为简单表达式:符合下推要求后,DELETE 语句可正常执行,成功删除数据。
    • 改造 SQL 示例:先为 ods_tm_station_line_info 添加新列,比如采集时间列 etl_gmt。
-- 改造为简单表达式 DELETE FROM `starrocks~dispatch`.`dispatch`.`ods_tm_station_line_info` -- 使用动态参数赋值 WHERE etl_gmt >= ${@com.base.core.domain.tools.BaseTools@getDateFmt(『-1d』,『yyyy-MM-dd』)} and etl_gmt <= ${@com.base.core.domain.tools.BaseTools@getDateFmt(『yyyy-MM-dd』)}; -- 删除所有数据,注意不要使用 1=1 DELETE FROM `starrocks~dispatch`.`dispatch`.`ods_tm_station_line_info` where line_no <> 『不存在的字段值』;
  • 保持复杂表达式:仍无法删除,与原有现象一致。
  • 备选方案可行:对于无法简化的逻辑,可通过其他任务执行,实现数据清理目标。

补充说明:FlinkSQL 通过 JDBC 连接器删除数据时,必须遵循其删除下推的语法规范。请数据开发人员在编写删除语句时注意此约束。

http://www.jsqmd.com/news/459479/

相关文章:

  • Qwen3-0.6B与Phi-3性能对比:轻量模型推理速度实测案例
  • C#进阶 简单数据结构与泛型
  • HG-ha/MTools零基础教程:集成AI功能的一键部署方案
  • 相对路径 绝对路径 核心总结(Windows + Java 开发专用)
  • 图图的嗨丝造相-Z-Image-Turbo多平台部署:Jetson Orin Nano边缘设备上的轻量化运行方案
  • VMware Workstation 17 Pro 中文最新完整版下载地址和安装教程与永久key密钥 VMware-workstation-full-17.0.1.exe
  • Qwen3-VL-8B中文理解强?多语言图文对比评测
  • 目标检测模型和语言模型
  • lora-scripts实战:基于50张图片训练古风水墨风格,生成效果详细评测
  • PyTorch 2.9保姆级教程:从零开始搭建GPU加速训练环境
  • Emotion2Vec+ Large输出目录管理:results文件归档自动化脚本
  • 多模态多目标带局部PF问题
  • Face Fusion能否部署在云服务器?远程访问可行性分析
  • GLM-TTS固定种子42?可复现性在生产中的应用
  • 自然语言处理与bert
  • 文墨共鸣惊艳效果展示:转述识别准确率92.7%的水墨风语义分析作品集
  • 指针基础知识总结
  • 为什么你始终看不懂JavaScript?
  • vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)
  • Cursor 生死存亡:AI 编程痛点解决效率提升实战
  • LiuJuan Z-Image Generator实战案例:跨境电商独立站产品模特图生成SOP
  • Kdevelop使用步骤详解(Linux)
  • vue3:解决天地图api调用报403(Forbidden)错误,调用天地图服务出现403错误(或者部署到服务器后天地图API接口返回403详细排查和解决方法)彻底解决天地图403 Forbidden
  • Qwen3-0.6B-FP8详细步骤:Web界面主题定制+Logo替换与品牌化部署
  • 2026年知名的锦纶面料品牌推荐:coolmax面料/阳离子面料/石墨烯面料厂家最新推荐 - 行业平台推荐
  • 百川2-13B-4bits开源镜像部署案例:教育机构用作AI助教,支持学生编程答疑
  • (第二篇)Spring AI 实战进阶:从 0 搭建 SaaS 模式多租户 AI 客服平台(核心难点 + 性能优化全解析)
  • 部署完OpenClaw不能随时用!郁闷不?cpolar能解锁N种随身玩法!
  • [React Native for OpenHarmony] 将代码提交至AtomGit平台自建公开仓库用于分布式管理
  • PETRV2-BEV训练效果惊艳:BEV检测结果叠加原始环视图像的精准对齐展示