严格模式
严格模式 (Strict Mode) 是导入操作中的一个选配项,其设置会影响 StarRocks 对某些数据的导入行为和最终导入到 StarRocks 中的结果数据。
本文档主要介绍什么是严格模式、以及如何设置严格模式。
严格模式介绍
在导入过程中,原始列跟目标列的数据类型可能不完全一致,这种情况下,StarRocks 会对存在数据类型不一致的原始列值进行转换。转换过程中可能会发生字段类型不匹配、字段超长等转换失败的情况。转换失败的字段称为“错误字段”,包含错误字段的数据行称为“错误的数据行”。严格模式用于控制导入过程中是否会对这些错误的数据行进行过滤。
严格模式的过滤策略如下:
-
如果开启严格模式,StarRocks 会把错误的数据行过滤掉,只导入正确的数据行,并返回错误数据详情。
-
如果关闭严格模式,StarRocks 会把转换失败的错误字段转换成
NULL
值,并把这些包含NULL
值的错误数据行跟正确的数据行一起导入。
注意以下两点:
-
实际导入过程中,正确的数据行和错误的数据行都有可能存在
NULL
值。如果目标列不允许NULL
值,则 StarRocks 会报错,并把这些包含NULL
值的数据行过滤掉。 -
导入作业能够容忍的因数据质量不合格而过滤掉的错误数据行所占的最大比例,由作业的可选参数
max_filter_ratio
控制。
INSERT 导入方式自 v3.4.0 起支持 max_filter_ratio
参数。
下面以 CSV 格式的数据文件为例来说明严格模式的效果。假设目标列数据类型为 TINYINT [-128, 127]。以 \N
(表示空值 null)、abc
、2000
和 1
四个原始列值为例:
-
原始列值
\N
在转换为 TINYINT 类型后变为NULL
。NOTE
原始列值
\N
不管目标列的数据类型是什么,转换后都变为NULL
。 -
原始列值
abc
由于数据类型与目标列的数据类型 TINYINT 不一致,因此转换失败,变为NULL
。 -
原始列值
2000
由于不在目标列的数据类型 TINYINT 的允许范围之内,因此转换失败,变为NULL
。 -
原始列值
1
可以正常转换为 TINYINT 类型的数值1
。
如果不开启严格模式,所有数据行都可以导入。如果开启严格模式,则只有包含 \N
或 1
的数据行可以导入,而包含 abc
或 2000
的数据行会被过滤掉。过滤掉的数据行记入导入作业参数 max_filter_ratio
允许的因数据质量不合格而过滤掉的数据行。