Flink SQL 基于Update流出现空值无法过滤问题

发布时间:2026/11/3 12:11:40

Flink SQL 基于Update流出现空值无法过滤问题 问题背景问题描述基于Flink-CDC(2.3.0 Flink 1.15) Flink SQL的实时计算作业在运行一段时间后突然发现插入数据库的计算结果发生部分主键属性发生失败导致后续计算结果无法插入 超过失败次数失败的情况问题报错Caused by: java.sql.BatchUpdateException: Batch entry 0 INSERT INTO dm_hljy.dws_table_name (op_date, school_year, campus_name, school_name, depart_name, total_opfare, ids, update_time) VALUES (2024-03-11 00:00:0008, 2023, xxxx, xxxx学校, xxxx小学部, 203333300000, 57, 2024-03-21 09:31:08.4708) ON DUPLICATE KEY UPDATE school_yearVALUES(school_year), total_opfareVALUES(total_opfare), idsVALUES(ids), update_timeVALUES(update_time) was aborted: ERROR: dn_6007_6008: null value in column depart_name violates not-null constraint Call getNextException to see other errors in the batch. at com.huawei.gauss200.jdbc.jdbc.BatchResultHandler.handleCompletion(BatchResultHandler.java:171) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at com.huawei.gauss200.jdbc.core.v3.QueryExecutorImpl.executeBatch(QueryExecutorImpl.java:586) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at com.huawei.gauss200.jdbc.jdbc.PgStatement.executeBatch(PgStatement.java:883) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at com.huawei.gauss200.jdbc.jdbc.PgPreparedStatement.executeBatch(PgPreparedStatement.java:1580) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at org.apache.flink.connector.jdbc.statement.FieldNamedPreparedStatementImpl.executeBatch(FieldNamedPreparedStatementImpl.java:65) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.executor.TableSimpleStatementExecutor.executeBatch(TableSimpleStatementExecutor.java:64) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.executor.TableBufferReducedStatementExecutor.executeBatch(TableBufferReducedStatementExecutor.java:101) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.JdbcOutputFormat.attemptFlush(JdbcOutputFormat.java:266) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.JdbcOutputFormat.flush(JdbcOutputFormat.java:236) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.JdbcOutputFormat.lambda$open$0(JdbcOutputFormat.java:159) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_332] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[?:1.8.0_332] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_332] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[?:1.8.0_332] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_332] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_332] ... 1 more Caused by: com.huawei.gauss200.jdbc.util.PSQLException: ERROR: dn_6007_6008: null value in column depart_name violates not-null constraint at com.huawei.gauss200.jdbc.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2856) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at com.huawei.gauss200.jdbc.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2587) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at com.huawei.gauss200.jdbc.core.v3.QueryExecutorImpl.executeBatch(QueryExecutorImpl.java:575) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at com.huawei.gauss200.jdbc.jdbc.PgStatement.executeBatch(PgStatement.java:883) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at com.huawei.gauss200.jdbc.jdbc.PgPreparedStatement.executeBatch(PgPreparedStatement.java:1580) ~[huaweicloud-dws-jdbc-8.1.1.1-200.jar:?] at org.apache.flink.connector.jdbc.statement.FieldNamedPreparedStatementImpl.executeBatch(FieldNamedPreparedStatementImpl.java:65) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.executor.TableSimpleStatementExecutor.executeBatch(TableSimpleStatementExecutor.java:64) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.executor.TableBufferReducedStatementExecutor.executeBatch(TableBufferReducedStatementExecutor.java:101) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.JdbcOutputFormat.attemptFlush(JdbcOutputFormat.java:266) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.JdbcOutputFormat.flush(JdbcOutputFormat.java:236) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at org.apache.flink.connector.jdbc.internal.JdbcOutputFormat.lambda$open$0(JdbcOutputFormat.java:159) ~[flink-connector-jdbc-1.15.0-h0.cbu.mrs.320.r33.jar:1.15.0-h0.cbu.mrs.320.r33] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_332] at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[?:1.8.0_332] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_332] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[?:1.8.0_332] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_332] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_332定位定位思路1.方向一怀疑数据库插入存在数据处理时造成数据处理出现空值的情况即数据本身不为空但是数据插入却出现了空 2.方向二Flink-SQL在消费kafka数据时存在了空值故加工的数据计算结果存在空值定位过程因插入数据库定位比较麻烦且数据库已经设置该字段为主属性故出现插入时处理为空值的概率较小。故先从较为简单的Flink SQL查询数据定位方法一查询该字段为空的记录,待作业执行完成后未查询到空值对应记录select select * from table_name where depart_name is null or depart_name or char_length(depart_name) 0;因考虑到使用Flink-CDC进行变更数据捕获故对应的update流存在-U,U,-D,I记录因此随着插入记录存在空值被记录进去的情况故采用view的方式先将宽表的加工、关联方式创建为view然后进行空值的过滤。实施如下create view view_prd as select a.* ,b.* from a join b on a.id b.id select * from view_prd where depart_name is null or depart_name or char_length(depart_name) 0;通过查询结果发现存在最后一条记录存在空值的原因往源头定位发现该字段之前为空后面进行更新填充到值出现-U记录导致数据插入持续失败原因因为flink-SQL消费的数据时kafka topicflink以upsert-kafka形式的connector进行写入故存在changelog 流中数据更新存在-UU的记录按照Key进行区分唯一条记录value 为空(-U)的记录kafka也导致出现空值解决通过在DWS宽表创建一层View如上)在写入DWS宽表的kafka topic之前现将该字段空值过滤即可排除空值涉及记录被纳入结果指标计算的范围中
延伸阅读

更多相关文章

2026/10/24 11:56:06

AI绘画角色一致性实战:LoRA与ControlNet打造多角度骑士西奥

最近在AI绘画圈子里,一个有趣的现象正在发生:许多创作者不再满足于生成单张精美的图片,而是开始热衷于围绕同一个角色,从不同角度、不同情境进行“角色深度塑造”。这背后反映的,其实是AI绘画技术从“炫技”走向“实用…

2026/10/28 0:22:00

毕业论文修改的进阶指南:从查重达标到质量跃升

在撰写毕业论文的过程中,文本修改是一个不可避免的环节。面对不同的修改方式,我常常感到困惑:是使用传统的同义词替换,还是借助通用大模型辅助改写,或者使用专门的论文文本处理工具?各自适合怎样的任务&…

2026/11/3 12:07:59

糖类结构—性质—代谢知识地图:单糖、多糖与EMP/TCA/PPP

简介:这份生物化学学习要点汇总面向高校生化课程初学者与备考复习者,围绕课程绪论、学科框架和糖类基础内容做系统梳理,适合课前预习、课堂笔记补全与期末查漏补缺。包内为1个doc文档,压缩包约426KB,体量轻便&#xff…

2026/11/3 12:07:59

Kylin V10 ARM架构源码编译OceanBase实战与避坑指南

国产化软硬件适配这两年从“可选项”变成了很多团队的“必答题”,尤其是在信创环境下,把一套分布式数据库在国产 CPU 加国产操作系统上从源码跑起来,几乎是每个基础架构团队都会碰到的场景。这次我拿到的任务是在 Kylin V10 操作系统、ARM 架…

2026/11/3 12:07:59

MPU-6000/6050六轴传感器:加速度计、陀螺仪、DMP与低功耗FIFO

简介:这份PDF文档是MPU-6000与MPU-6050产品说明书的实用中文翻译版,面向嵌入式开发、无人机、机器人及运动追踪方向的硬件工程师与学习者,用于快速理解九轴运动处理传感器的内部结构、寄存器、接口配置和电气设计要点。压缩包内共1个PDF文件&…

2026/11/3 12:07:59

Spec-kit实践:规范驱动开发告别文档与代码脱节

1. 为什么需要Spec-kit:规范驱动的断点在哪 1.1 SDD的核心理念:规范是唯一的事实源 SDD(Specification-Driven Development,规范驱动开发)说起来并不神秘,团队里只要有文档习惯,或多或少都在实…

2026/11/3 12:07:59

FileZilla SFTP连接配置与传输优化实战指南

SFTP 这个词,第一次接触的人多半是在配置服务器或者对接第三方数据接口的时候撞上的。对方甩过来一个地址、一个端口、一组账号密码,然后补一句“用 FileZilla 连就行”,剩下的事就得自己摸索了。FileZilla 算是这个领域里装机量最大的客户端…

2026/11/3 12:02:56

ObjectMapper从入门到精通:序列化配置、泛型与性能优化实战

做后端开发这些年,序列化这块踩过的坑真不少。早期用原生手写拼JSON,字段一多就乱套;后来换成Jackson,一开始也只是停留在writeValueAsString和readValue两个方法上,直到项目里遇到泛型反序列化、日期格式错乱、循环引…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑