这个错误 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. 总结排查步骤

  1. 不要慌,数据没写进去,保证了一致性。
  2. 执行 SHOW LOAD ... LIMIT 1 找到具体的错误信息(是哪一列、什么类型错误)。
  3. 首选: 修正源头数据或修改表结构(最安全)。
  4. 次选: 如果脏数据无关紧要,执行 SET enable_insert_strict = false; 后再重试。

建议: 生产环境建议保持严格模式,先查清楚为什么数据会脏,从源头治理数据质量。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐