doris报错 java.sql.SQLException: errCode = 2, detailMessage = Insert has filtered data in strict mode.
·
这个错误 errCode = 2, detailMessage = Insert has filtered data in strict mode 是 Apache Doris 中非常经典的数据导入错误。
1. 错误含义
- 核心意思: 在你执行
INSERT或数据导入时,Doris 检测到部分数据不符合表结构定义或质量要求(例如类型不匹配、长度超限、非空约束等)。 - Strict Mode(严格模式): 当前会话或导入任务开启了“严格模式”。在这种模式下,只要有任意一行数据被过滤(Filter),整个导入任务就会失败并抛出异常,而不是忽略错误行继续导入。
- 结果: 为了保护数据一致性,Doris 拒绝了这次写入。
2. 如何定位具体哪条数据错了?(关键步骤)
光看这个报错不知道具体错在哪,你需要查看 Doris 的错误详情。
方法 A:使用 SHOW LOAD 查看(推荐)
Doris 将 INSERT 操作内部也视为一个 Load 任务。执行以下 SQL 查看最近一次任务的详情:
-- 查看当前数据库最近的导入任务
SHOW LOAD FROM 你的数据库名 ORDER BY CreateTime DESC LIMIT 1;
在返回结果中,重点关注以下字段:
State: 应该是CANCELLED或FAILED。ErrorMsg: 这里通常会有更具体的错误原因(例如column type mismatch)。DetailsURL/ErrorURL: 如果有这个 URL,可以通过curl命令在服务器终端获取具体的错误行数据。curl "http://<fe_host>:<fe_http_port>/api/_load_error_log?file=<url 中的路径>"
方法 B:使用 SHOW WARNINGS(针对 JDBC Insert)
如果你是通过 Java JDBC 执行的 INSERT 语句,报错后立刻在当前会话执行:
SHOW WARNINGS;
这里可能会显示具体是哪一列的数据类型转换失败。
3. 常见原因及解决方案
原因 1:数据类型不匹配
- 现象: 表定义是
INT,但数据里传了"abc"或空字符串;表定义是DATE,但数据格式是"2023/10/01"而不是"2023-10-01"。 - 解决: 检查源代码或 ETL 流程,确保写入的数据类型与 Doris 表结构严格一致。
原因 2:字符串长度超限
- 现象: 表定义
VARCHAR(10),但实际数据长度为 15。 - 解决:
- 改数据: 截断数据。
- 改表结构:
ALTER TABLE 表名 MODIFY COLUMN 列名 VARCHAR(50);
原因 3:非空约束(NOT NULL)
- 现象: 表字段定义为
NOT NULL,但导入的数据中该列为NULL或空字符串。 - 解决: 确保数据源中该字段有值,或者修改表结构允许为空。
原因 4:Decimal 精度溢出
- 现象: 表定义
DECIMAL(10,2),但数据是12345678.901(整数位超了)。 - 解决: 调整 Decimal 精度或清洗数据。
4. 临时解决方案(如果不介意丢失脏数据)
如果你确认脏数据可以忽略,或者想先让任务跑通,可以通过调整参数来放宽限制。
方案 A:关闭插入严格模式(针对 INSERT 语句)
在执行 INSERT 之前,在当前会话中关闭严格模式。这样 Doris 会将错误数据转换为 NULL 或默认值,而不是报错。
-- 在执行 INSERT 之前运行
SET enable_insert_strict = false;
-- 然后再执行你的 INSERT 语句
INSERT INTO ...
注意:这会导致脏数据变成 NULL,需确认业务是否允许。
方案 B:提高容错率(针对 Stream Load / Broker Load)
如果是通过程序调用 Stream Load 接口,可以在 Header 中设置 max_filter_ratio。
"max_filter_ratio": "0.1"
含义:允许 10% 的数据出错。如果错误率低于 10%,任务成功;高于 10%,任务失败。
5. 总结排查步骤
- 不要慌,数据没写进去,保证了一致性。
- 执行
SHOW LOAD ... LIMIT 1找到具体的错误信息(是哪一列、什么类型错误)。 - 首选: 修正源头数据或修改表结构(最安全)。
- 次选: 如果脏数据无关紧要,执行
SET enable_insert_strict = false;后再重试。
建议: 生产环境建议保持严格模式,先查清楚为什么数据会脏,从源头治理数据质量。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)