导入失败,报错:“too many filtered rows xxx, “ErrorURL“:“

文章讲述了在使用DataX从MySQL导入数据到ApacheDoris时遇到的错误,主要原因是CSV文件列数少于表结构定义。提供了调整DataX配置和修改CSV格式的解决办法,包括更改line_delimiter和column_separator以避免导入错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题:

注:前面能正常写入,突然就报错,导入失败,报错:“too many filtered rows xxx, "ErrorURL":"

{"TxnId":769494,"Label":"datax_doris_writer_bf176078-15d7-414f-8923-b0eb5f6d5da1","TwoPhaseCommit":"false","Status":"Fail","Message":"[INTERNAL_ERROR]too many filtered rows","NumberTotalRows":325476,"NumberLoadedRows":325473,"NumberFilteredRows":3,"NumberUnselectedRows":0,"LoadBytes":94697450,"LoadTimeMs":1498,"BeginTxnTimeMs":0,"StreamLoadPutTimeMs":2,"ReadDataTimeMs":117,"WriteDataTimeMs":1495,"CommitAndPublishTimeMs":0,"ErrorURL":"http://IP:8040/api/_load_error_log?file=__shard_8/error_log_insert_stmt_ce466641e5bad2af-99171040d6f76fb8_ce466641e5bad2af_99171040d6f76fb8"}
http://IP:8040/api/_load_error_log?file=__shard_8/error_log_insert_stmt_ce466641e5bad2af-99171040d6f76fb8_ce466641e5bad2af_99171040d6f76fb8"

内容如下:
Reason: actual column number in csv file is  less than  schema column number.actual number: 11, column separator: [	], line delimiter: [
], schema column number: 16; . src line [320746671400	6540dbac03e56b6315de10f8	279ca466-2047-42f5-9932-1730703644e4	10	沙河市中瑞玻璃制品有限公司玻璃深加工生产线扩建项...	2023-10-31 00:00:00	130582	10	1004	10	]; 
Reason: actual column number in csv file is  less than  schema column number.actual number: 1, column separator: [	], line delimiter: [
], schema column number: 16; . src line [2023-10-31]; 
Reason: actual column number in csv file is  less than  schema column number.actual number: 6, column separator: [	], line delimiter: [
], schema column number: 16; . src line [	\N	0	1698749356710	2023-10-31 18:49:16	2023-11-13 11:05:48]; 

二、解决办法

Datax 代码库编译

从datax 代码库拉取代码,执行编译

git clone https://github.com/alibaba/DataX.git
cd datax
mvn package assembly:assembly -Dmaven.test.skip=true

注:MYSQL版本改成你使用的版本;

 more  pom.xml 

编译完成后可以在 datax/target/Datax 下看到datax.tar.gz 包

my_import.json

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",
                    "parameter": {
                        "column": ["id","order_code","line_code","remark","unit_no","unit_name","price"],
                        "connection": [
                            {
                                "jdbcUrl": ["jdbc:mysql://localhost:3306/demo"],
                                "table": ["employees_1"]
                            }
                        ],
                        "username": "root",
                        "password": "xxxxx",
                        "where": ""
                    }
                },
                "writer": {
                    "name": "doriswriter",
                    "parameter": {
                        "loadUrl": ["127.0.0.1:8030"],
                        "loadProps": {
                        },
                        "column": ["id","order_code","line_code","remark","unit_no","unit_name","price"],
                        "username": "root",
                        "password": "xxxxxx",
                        "postSql": ["select count(1) from all_employees_info"],
                        "preSql": [],
                        "flushInterval":30000,
                        "connection": [
                          {
                            "jdbcUrl": "jdbc:mysql://127.0.0.1:9030/demo",
                            "selectedDatabase": "demo",
                            "table": ["all_employees_info"]
                          }
                        ],
                        "loadProps": {
                            "format": "json",
                            "strip_outer_array":"true",
                            "line_delimiter": "\\x02"
                        }
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

备注:

"loadProps": {
  "format": "json",
  "strip_outer_array":"true",
  "line_delimiter": "\\x02"
}

  1. 这里我们使用了 JSON 格式导入数据
  2. line_delimiter 默认是换行符,可能会和数据中的值冲突,我们可以使用一些特殊字符或者不可见字符,避免导入错误
  3. strip_outer_array :在一批导入数据中表示多行数据,Doris 在解析时会将数组展开,然后依次解析其中的每一个 Object 作为一行数据
  4. 更多 Stream load 参数请参照 [Stream load文档](Stream load - Apache Doris)
  5. 如果是 CSV 格式我们可以这样使用
"loadProps": {
   "format": "csv",
   "column_separator": "\\x01",
   "line_delimiter": "\\x02"
}

CSV 格式要特别注意行列分隔符,避免和数据中的特殊字符冲突,这里建议使用隐藏字符,默认列分隔符是:\t,行分隔符:\n

4.执行datax任务,具体参考 datax官网,或者

DataX Doriswriter - Apache Doris

<think>嗯,用户遇到了导入数据时的报错,显示“Status”: “Fail”,“Message”:too many filtered rows”。首先,我需要理解这个错误信息的含义。通常,“too many filtered rows”意味着在导入数据的过程中,系统或应用程序过滤掉了大量的行,超过了预设的限制,导致导入失败。 接下来,我要考虑可能的原因。可能的情况包括数据质量问题,比如缺失值、格式错误,或者数据不符合某些业务规则或约束条件。例如,某些字段可能要求非空,但数据中存在大量空值;或者数值超出了允许的范围,如日期格式不正确,数字过大或过小等。此外,数据中的重复记录也可能被过滤掉,特别是当系统设置了唯一性约束时。 然后,我需要思考如何帮助用户解决这个问题。首先,建议用户检查数据质量,查看被过滤掉的行,找出具体的过滤原因。可以通过查看日志或错误报告来了解哪些行被过滤以及原因。如果使用的是数据库或ETL工具,通常会有详细的错误日志。接着,用户需要根据错误原因调整数据清洗策略,比如填充缺失值、修正格式错误,或者调整业务规则的限制。如果确实有大量合法数据被误过滤,可能需要调整系统的过滤阈值或规则,例如提高允许的过滤行数上限或放宽某些约束条件。 另外,分批次导入数据也是一个可行的解决方法,特别是当数据量极大时,分批次处理可以减少单次导入的数据量,避免触发过滤限制。同时,优化数据预处理流程,比如在导入前进行数据验证和清洗,可以有效减少过滤行数。如果用户使用的是特定工具或框架,可能需要查阅相关文档,了解是否有配置选项可以调整过滤行为,比如设置ignore_errors=True或类似的参数来跳过错误行。 最后,需要提醒用户在进行任何更改之前备份数据,以防万一。同时,建议用户在解决问题后,逐步测试调整后的导入流程,确保问题得到解决且数据完整性不受影响。</think>针对`"Status": "Fail", "Message": "too many filtered rows"`的导入报错,以下是分步排查与解决方案: --- ### **错误本质解析** 此报错表示数据加载时触发过滤机制,常见于以下场景: 1. **字段约束过滤**:如非空字段出现空值、数据类型不匹配(字符串填入数字列) 2. **业务规则过滤**:如金额字段值超出允许范围(`price < 0`)、时间格式非法(`2024-13-32`) 3. **重复数据过滤**:唯一性约束导致重复记录被拦截 4. **验证规则过滤**:自定义校验规则(如邮箱格式、手机号格式)不通过 --- ### **5步排查法** #### 步骤1:获取详细错误日志 ```python # 示例:使用pandas读取时显示具体错误位置 try: df = pd.read_csv("data.csv", dtype={"price": float}, parse_dates=["order_time"]) except Exception as e: print(f"错误详情:{str(e)}") ``` #### 步骤2:统计过滤行特征 ```python # 检查空值分布 null_counts = df.isnull().sum() print(f"空值统计:\n{null_counts}") # 检查数值范围异常 print(f"价格异常:{df[df['price'] < 0].shape[0]}条负值记录") # 检查日期格式有效性 invalid_dates = df[pd.to_datetime(df['date'], errors='coerce').isna()] print(f"无效日期:{len(invalid_dates)}条") ``` #### 步骤3:数据质量修复 ```python # 空值处理(示例) df["address"].fillna("未知", inplace=True) # 格式修正(示例) df["phone"] = df["phone"].str.replace(r'\D', '', regex=True) # 去除非数字字符 df = df[df["phone"].str.len() == 11] # 保留11位手机号 # 业务规则修正(示例) df["price"] = df["price"].clip(lower=0) # 将负价格设为0 ``` #### 步骤4:调整导入参数 ```python # 关键参数调整(以pandas为例) df.to_sql('table_name', engine, if_exists='append', # 追加模式 index=False, chunksize=1000, # 分块写入 method='multi') # 批量操作 ``` #### 步骤5:系统配置调优 ```sql -- 临时关闭约束检查(以PostgreSQL为例) ALTER TABLE your_table DISABLE TRIGGER ALL; -- 执行数据导入 -- 导入完成后重新启用 ALTER TABLE your_table ENABLE TRIGGER ALL; ``` --- ### **典型解决方案对比** | 方案 | 适用场景 | 优点 | 缺点 | |------|----------|------|------| | **数据预处理** | 源数据质量可控 | 根治问题 | 需要开发清洗脚本 | | **放宽约束** | 紧急修复 | 快速生效 | 可能影响数据完整性 | | **分批导入** | 大数据量场景 | 降低单次压力 | 需要额外调度逻辑 | | **错误跳过** | 允许部分丢失 | 保证主要数据 | 需人工核对丢失数据 | --- ### **高级调试技巧** 1. **差异分析**: ```python # 对比原始数据与成功导入数据量差异 raw_count = len(df) imported_count = pd.read_sql("SELECT COUNT(*) FROM table", engine).iloc[0,0] print(f"过滤率:{(raw_count - imported_count)/raw_count:.2%}") ``` 2. **错误行捕获**: ```python # 使用错误批处理(以petl为例) from petl import capture bad_rows = [] def error_handler(exc, row): bad_rows.append(row) with capture(exceptions=(ValueError,), handler=error_handler): etl.tocsv(df, 'output.csv') ``` 3. **自动化验证流水线**: ```python # 使用pandera定义数据模式 import pandera as pa schema = pa.DataFrameSchema({ "user_id": pa.Column(int, checks=pa.Check.ge(0)), "email": pa.Column(str, checks=pa.Check.str_matches(r'^[\w.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')), "age": pa.Column(int, checks=pa.Check.in_range(0, 150)) }) schema.validate(df) # 自动抛出详细错误 ``` --- ### **预防性措施** 1. **数据验收测试**: ```python # 使用Great Expectations创建数据质量测试 expectation_suite = """ { "expectations": [ { "expectation_type": "expect_column_values_to_not_be_null", "kwargs": { "column": "order_id" } }, { "expectation_type": "expect_column_values_to_be_between", "kwargs": { "column": "temperature", "min_value": -50, "max_value": 60 } } ] } """ ``` 2. **数据质量看板**: ```sql -- 创建数据质量监测视图 CREATE VIEW data_quality_monitor AS SELECT 'missing_values' AS metric_type, COUNT(*) FILTER (WHERE column1 IS NULL) / COUNT(*) AS ratio FROM table UNION ALL SELECT 'out_of_range', COUNT(*) FILTER (WHERE column2 NOT BETWEEN 0 AND 100) / COUNT(*) FROM table; ``` 遇到具体业务场景时,建议提供过滤规则逻辑和样例数据片段,可定制更精准的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值