DataWorks中WARN 回滚此次写入, 采用每次写入一行方式提交,如何解决?

DataWorks中WARN CommonRdbmsWriter$Task - 回滚此次写入, 采用每次写入一行方式提交. 因为:java.sql.BatchUpdateException: 违反CHECK约束[HS1372_CONS134219447]?

展开
收起
真的很搞笑 2024-03-19 15:14:26 246 分享 版权
阿里云 AI 助理回答

在DataWorks中遇到WARN CommonRdbmsWriter$Task - 回滚此次写入, 采用每次写入一行方式提交. 因为:java.sql.BatchUpdateException: 违反CHECK约束[HS1372_CONS134219447]的错误,通常是因为目标数据库中的某些数据违反了表定义中的CHECK约束条件。以下是对此问题的详细分析和解决方法:


问题原因

  1. 违反CHECK约束
    CHECK约束是数据库中用于限制列值范围的一种规则。当插入或更新的数据不符合该约束时,数据库会抛出异常。例如:

    • 如果某列定义了CHECK (age > 0),但插入了负数或零值,则会触发此错误。
    • 在本例中,HS1372_CONS134219447是具体的约束名称,表示目标表中存在一个名为HS1372_CONS134219447CHECK约束。
  2. 批量写入失败
    DataWorks默认使用批量写入(Batch Insert)的方式提高性能。如果批量写入中某一行数据违反了CHECK约束,整个批次都会回滚,并切换为逐行写入模式以定位具体问题。


解决方案

1. 检查目标表的CHECK约束

  • 登录目标数据库(如Oracle、MySQL等),查询目标表的CHECK约束定义。例如,在Oracle中可以执行以下SQL语句:
    SELECT constraint_name, search_condition
    FROM user_constraints
    WHERE table_name = 'YOUR_TABLE_NAME' AND constraint_type = 'C';
    
  • 确认HS1372_CONS134219447的具体约束条件,例如是否对某些列的值范围、格式等进行了限制。

2. 检查源数据

  • 根据CHECK约束的定义,检查源数据是否存在不符合约束条件的记录。例如:
    • 如果约束要求age > 0,则需要检查源数据中是否存在age <= 0的记录。
    • 如果约束要求字段值必须符合某种正则表达式,则需要验证源数据是否满足该正则表达式。
  • 可以通过以下步骤排查:
    1. 在DataWorks中配置数据同步任务时,启用脏数据检查功能。
    2. 查看脏数据日志,定位具体违反约束的记录。

3. 修改源数据或目标表约束

  • 修改源数据:如果源数据确实存在问题,可以在数据同步前进行清洗。例如:
    • 使用SQL语句过滤掉不符合约束条件的记录。
    • 在DataWorks中配置preSql参数,执行数据清洗操作。
  • 修改目标表约束:如果业务允许,可以调整目标表的CHECK约束。例如:
    • 放宽约束条件。
    • 删除不必要的约束。

4. 调整批量写入参数

  • 如果无法完全避免违反约束的情况,可以通过调整批量写入参数降低影响:
    • 减小batchSize参数值,减少每次批量写入的数据量。例如,将batchSize从默认的1024调整为100。
    • 配置ignoreWriteError参数为true,忽略写入错误并继续处理后续数据。

操作步骤示例

1. 查询目标表的CHECK约束

假设目标表名为employees,执行以下SQL语句:

SELECT constraint_name, search_condition
FROM user_constraints
WHERE table_name = 'EMPLOYEES' AND constraint_type = 'C';

输出结果可能如下:

CONSTRAINT_NAME       SEARCH_CONDITION
--------------------- -----------------
HS1372_CONS134219447  salary > 0

2. 检查源数据

假设源表名为source_employees,执行以下SQL语句检查是否存在salary <= 0的记录:

SELECT *
FROM source_employees
WHERE salary <= 0;

3. 修改源数据

如果发现不符合约束的记录,可以通过以下SQL语句删除或更新这些记录:

DELETE FROM source_employees
WHERE salary <= 0;

4. 调整批量写入参数

在DataWorks中修改Writer脚本,调整batchSize参数:

"parameter": {
    "batchSize": 100
}

注意事项

  • 脏数据检查:建议在数据同步任务中启用脏数据检查功能,以便快速定位问题。
  • 性能影响:减小batchSize会降低写入性能,请根据实际需求权衡。
  • 业务逻辑:修改目标表约束或源数据时,请确保不会影响业务逻辑。

通过以上步骤,您可以有效解决违反CHECK约束导致的批量写入失败问题。如果问题仍未解决,请进一步检查源数据和目标表的其他约束条件。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。

还有其他疑问?
咨询AI助理