``` Caused by: org.apache.doris.spark.exception.StreamLoadException: stream load error, load status:Fail, response:StreamLoadResponse(200,OK,{ "TxnId": 22647242, "Label": "spark_streamload_20250326_083305_98e41310899b4b918d848f3e6a029525", "Comment": "", "TwoPhaseCommit": "false", "Status": "Fail", "Message": "[DATA_QUALITY_ERROR]too many filtered rows", "NumberTotalRows": 2762, "NumberLoadedRows": 0, "NumberFilteredRows": 2562, "NumberUnselectedRows": 0, "LoadBytes": 1197623, "LoadTimeMs": 104, "BeginTxnTimeMs": 0, "StreamLoadPutTimeMs": 2, "ReadDataTimeMs": 3, "WriteDataTimeMs": 101, "ReceiveDataTimeMs": 72, "CommitAndPublishTimeMs": 0, "ErrorURL": "http://10.0.42.207:8040/api/_load_error_log?file=__shard_218/error_log_insert_stmt_704387dc76cd43fe-9585f67a31a118b0_704387dc76cd43fe_9585f67a31a118b0" }```分析数栖平台SparkSQL错误原因
时间: 2025-04-13 17:45:50 浏览: 139
<think>好的,我现在需要分析用户提供的Apache Doris SparkSQL错误日志。首先,用户遇到了一个StreamLoadException,错误信息显示“DATA_QUALITY_ERROR: too many filtered rows”。我需要逐步分析可能的原因,并给出解决方案。
首先看错误信息的关键点:NumberTotalRows是2762,NumberLoadedRows为0,NumberFilteredRows是2562。这说明所有导入的行都被过滤了,或者大部分被过滤。接下来,我需要考虑数据过滤的可能原因。
可能原因一:表结构不匹配。比如字段类型不兼容,或者字段数量不一致。例如,源数据中的字符串长度超过目标字段定义,或者数值类型不符,导致类型转换失败。
可能原因二:约束条件严格。目标表可能设置了NOT NULL约束,但源数据中存在NULL值;或者有CHECK约束,数据不符合条件被过滤。
可能原因三:分区或分桶规则。如果数据不符合目标表的分区或分桶规则,可能导致数据被过滤。比如分区键的值不在现有分区中,或者分桶键计算错误。
可能原因四:数据格式问题。源数据可能存在格式错误,如日期格式不匹配,或者JSON解析失败,导致整行被过滤。
可能原因五:过滤条件设置。可能在Stream Load作业中配置了filter参数,或者目标表有前置的过滤条件,导致数据被过滤。
接下来需要逐一验证这些可能性。首先检查表结构是否匹配,确认字段类型、长度、是否允许NULL等。然后查看表的约束条件,是否有NOT NULL或CHECK约束。接着检查分区和分桶设置,确保数据符合规则。数据格式方面,需要验证日期、数值等格式是否正确。最后,查看Stream Load的配置是否有过滤参数。
另外,查看ErrorURL提供的错误日志,里面可能有更详细的错误信息,比如具体哪些行被过滤及原因。用户应该访问该URL获取详细日志,进一步定位问题。
总结建议步骤:检查表结构、约束、分区规则;验证数据格式;查看错误日志详情;调整Stream Load配置或数据预处理。这样可以系统性地解决问题,减少过滤行数,确保数据正确导入。</think>### 错误分析及解决步骤:
#### 1. **核心错误定位**
错误日志中关键字段显示:
- **NumberTotalRows**: 2762(总数据行数)
- **NumberLoadedRows**: 0(成功加载行数)
- **NumberFilteredRows**: 2562(过滤行数,占比92.7%)
**直接原因**:`DATA_QUALITY_ERROR: too many filtered rows` 表示超过90%的数据因质量校验失败被过滤,导致事务提交失败。
---
#### 2. **常见原因排查**
##### **(1) 数据与表结构不匹配**
- **字段类型冲突**:例如源数据为字符串但目标字段为数值类型,或日期格式不匹配。
- 检查项:对比Spark DataFrame Schema与Doris表Schema的字段类型、长度、精度。
- **空值约束冲突**:目标字段定义为`NOT NULL`但源数据存在空值。
- 检查项:执行`SHOW CREATE TABLE <table_name>`查看字段约束。
##### **(2) 数据内容违规**
- **分区/分桶键不合法**:数据的分区键值未预先创建或分桶键计算错误。
- 检查项:确认数据的分区键值是否在`SHOW PARTITIONS FROM <table_name>`列表中。
- **唯一键冲突**:目标表设置了唯一键(Unique Key),但数据中存在重复值。
- 检查项:查看Doris表模型类型(Duplicate/Aggregate/Unique)及键定义。
##### **(3) 前置过滤条件生效**
- **WHERE条件过滤**:Stream Load任务中可能配置了`where`参数,导致不符合条件的数据被过滤。
- 检查项:确认Spark代码中Stream Load配置是否包含`options("where" -> "column > 0")`类参数。
##### **(4) 脏数据或编码问题**
- **非法字符**:例如存在不可见控制字符、UTF-8编码异常。
- **数值越界**:如`DECIMAL(5,2)`类型字段写入`1000.00`。
---
#### 3. **关键操作:获取详细错误日志**
通过日志中提供的`ErrorURL`直接查看具体错误:
```bash
curl "http://10.0.42.207:8040/api/_load_error_log?file=__shard_218/error_log_insert_stmt_704387dc76cd43fe-9585f67a31a118b0_704387dc76cd43fe_9585f67a31a118b0"
```
响应示例:
```json
{
"msg": "Value 'abc' cannot be cast to INT for column 'age'",
"file": "data.csv",
"line": 123
}
```
**日志会明确列出每个失败数据的行号、字段及具体错误**。
---
#### 4. **解决方案**
##### **(1) 数据预处理**
```scala
// 示例:Spark中过滤无效数据
val cleanedDF = rawDF
.filter($"age".isNotNull && $"age".cast("int").isNotNull)
.withColumn("date", to_date($"date_col", "yyyy-MM-dd"))
```
##### **(2) 调整表结构**
```sql
-- 放宽约束(如允许NULL)
ALTER TABLE target_table MODIFY COLUMN age INT NULL;
-- 增加分区(若分区键缺失)
ALTER TABLE target_table ADD PARTITION p20230326 VALUES [("2023-03-26")];
```
##### **(3) 修改Stream Load配置**
```scala
// 关闭严格模式(部分版本支持)
options("strict_mode" -> "false")
// 指定空值替代符
options("null_format" -> "\\N")
```
##### **(4) 分批重试**
对过滤行数较少的批次重试,降低单次写入压力。
---
### 总结流程图
```plaintext
触发DATA_QUALITY_ERROR
│
├─> 检查ErrorURL日志 → 定位具体错误字段
│
├─> 核对Schema兼容性(类型、约束)
│
├─> 验证分区/分桶键合法性
│
├─> 添加数据清洗逻辑 → 重试写入
│
└─> 调整表结构或Stream Load参数 → 二次验证
```
阅读全文
相关推荐




















