DataWorks中WARN CommonRdbmsWriter$Task - 回滚此次写入, 采用每次写入一行方式提交. 因为:java.sql.BatchUpdateException: 违反CHECK约束[HS1372_CONS134219447]?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在DataWorks中遇到WARN CommonRdbmsWriter$Task - 回滚此次写入, 采用每次写入一行方式提交. 因为:java.sql.BatchUpdateException: 违反CHECK约束[HS1372_CONS134219447]
的错误,通常是因为目标数据库中的某些数据违反了表定义中的CHECK
约束条件。以下是对此问题的详细分析和解决方法:
违反CHECK约束
CHECK
约束是数据库中用于限制列值范围的一种规则。当插入或更新的数据不符合该约束时,数据库会抛出异常。例如:
CHECK (age > 0)
,但插入了负数或零值,则会触发此错误。HS1372_CONS134219447
是具体的约束名称,表示目标表中存在一个名为HS1372_CONS134219447
的CHECK
约束。批量写入失败
DataWorks默认使用批量写入(Batch Insert)的方式提高性能。如果批量写入中某一行数据违反了CHECK
约束,整个批次都会回滚,并切换为逐行写入模式以定位具体问题。
CHECK
约束定义。例如,在Oracle中可以执行以下SQL语句:
SELECT constraint_name, search_condition
FROM user_constraints
WHERE table_name = 'YOUR_TABLE_NAME' AND constraint_type = 'C';
HS1372_CONS134219447
的具体约束条件,例如是否对某些列的值范围、格式等进行了限制。CHECK
约束的定义,检查源数据是否存在不符合约束条件的记录。例如:
age > 0
,则需要检查源数据中是否存在age <= 0
的记录。preSql
参数,执行数据清洗操作。CHECK
约束。例如:
batchSize
参数值,减少每次批量写入的数据量。例如,将batchSize
从默认的1024调整为100。ignoreWriteError
参数为true
,忽略写入错误并继续处理后续数据。假设目标表名为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
假设源表名为source_employees
,执行以下SQL语句检查是否存在salary <= 0
的记录:
SELECT *
FROM source_employees
WHERE salary <= 0;
如果发现不符合约束的记录,可以通过以下SQL语句删除或更新这些记录:
DELETE FROM source_employees
WHERE salary <= 0;
在DataWorks中修改Writer脚本,调整batchSize
参数:
"parameter": {
"batchSize": 100
}
batchSize
会降低写入性能,请根据实际需求权衡。通过以上步骤,您可以有效解决违反CHECK约束
导致的批量写入失败问题。如果问题仍未解决,请进一步检查源数据和目标表的其他约束条件。
DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。