Перейти к содержимому
Последнее обновление

Обработка некорректных данных

В процессе загрузки типы данных исходных и целевых столбцов могут не совпадать. Doris преобразует несовпадающие типы при загрузке, однако в ходе преобразования могут возникать следующие проблемы, из-за которых часть данных не удаётся загрузить корректно:

  • Несоответствие типа поля (например, запись строки "abc" в столбец TinyInt)
  • Превышение допустимой длины поля (например, запись 11 символов в столбец char(10))
  • Несоответствие точности / числовое переполнение (например, запись 10 в столбец Decimal(1,0))

Для обработки таких ситуаций Doris предоставляет два основных параметра управления загрузкой:

ПараметрНазначениеЗначение по умолчанию
strict_modeОпределяет, нужно ли отфильтровывать строки данных, для которых не удалось преобразовать тип столбцаfalse
max_filter_ratioЗадаёт максимально допустимую долю некорректных данных в общем объёме данных0

Комбинируя эти два параметра, можно гибко настраивать баланс между «строгим контролем качества данных» и «допуском небольшого количества грязных данных».

Строгий режим (strict_mode)​

Строгий режим (strict_mode) предназначен прежде всего для фильтрации строк данных, для которых не удалось преобразовать тип столбца при загрузке.

Стратегия фильтрации при ошибках преобразования типов столбцов​

В зависимости от настройки строгого режима система использует разные стратегии обработки:

  • Строгий режим отключён: полям, для которых преобразование завершилось ошибкой, присваивается значение NULL, а строки с некорректными данными, содержащие эти значения NULL, загружаются вместе с корректными строками данных.
  • Строгий режим включён: система отфильтровывает строки данных, для которых преобразование завершилось ошибкой, и загружает только корректные строки. Здесь «ошибка преобразования» означает следующее: исходное значение не равно NULL, но после преобразования типа столбца результат равен NULL. При этом значения NULL, полученные в результате вычисления функций, не считаются результатом преобразования типа столбца.
  • Обработка значений NULL: значения NULL могут встречаться как в корректных, так и в некорректных строках данных. Если целевой столбец не допускает значений NULL, строки данных, содержащие NULL, отфильтровываются.

Ниже на примере трёх типичных типов столбцов показаны различия в поведении при включённом и отключённом строгом режиме.

Пример 1: столбец типа TinyInt​

Тип исходных данныхПример исходных данныхЗначение после преобразования в TinyIntСтрогий режимРезультат
Значение NULL\NNULLВключён или отключёнNULL
Значение, отличное от NULL"abc" или 2000NULLВключёнНедопустимое значение (отфильтровано)
Значение, отличное от NULL"abc" или 2000NULLОтключёнNULL
Значение, отличное от NULL11Включён или отключёнЗагружено корректно
подсказка
  1. Столбцы таблицы допускают загрузку значений NULL.
  2. После преобразования в TinyInt значения abc и 2000 становятся NULL из-за несоответствия типа или точности. Если строгий режим включён, такие данные отфильтровываются; если отключён, загружается NULL.

Пример 2: столбец типа Decimal(1,0)​

Тип исходных данныхПример исходных данныхЗначение после преобразования в DecimalСтрогий режимРезультат
Значение NULL\NNULLВключён или отключёнNULL
Значение, отличное от NULLaaaNULLВключёнНедопустимое значение (отфильтровано)
Значение, отличное от NULLaaaNULLОтключёнNULL
Значение, отличное от NULL10NULL (переполнение)ВключёнОтфильтровано
Значение, отличное от NULL10NULL (переполнение)ОтключёнNULL
подсказка
  1. Столбцы таблицы допускают загрузку значений NULL.
  2. После преобразования в Decimal значение aaa становится NULL из-за несоответствия типа. Если строгий режим включён, такие данные отфильтровываются; если отключён, загружается NULL.
  3. 10 выходит за диапазон Decimal(1, 0) и преобразуется в NULL. Если строгий режим включён, это значение отфильтровывается; если отключён, загружается NULL.

Пример 3: столбец типа char(10)​

Тип исходных данныхПример исходных данныхЗначение после преобразования в char(10)Строгий режимРезультат
Значение NULL\NNULLВключён или отключёнNULL
Значение, отличное от NULLa1234567890a1234567890ВключёнПревышена допустимая длина, отфильтровано
Значение, отличное от NULLa1234567890a1234567890Отключёнa123456789 (усечено)
подсказка

Столбцы таблицы допускают загрузку значений NULL.

Включение строгого режима​

Значение strict_mode по умолчанию равно false. Ниже приведены примеры включения строгого режима для различных способов загрузки:

Stream Load

curl --location-trusted -u user:passwd \
-H "strict_mode: true" \
-T data.txt \
http://host:port/api/example_db/test_table/_stream_load

Broker Load

LOAD LABEL example_db.label_1
(
DATA INFILE("s3://bucket/data.txt")
INTO TABLE test_table
)
WITH S3 (...)
PROPERTIES
(
"strict_mode" = "true"
);

Routine Load

CREATE ROUTINE LOAD example_db.job1 ON test_table
PROPERTIES
(
"strict_mode" = "true"
)
FROM KAFKA (...);

MySQL Load

LOAD DATA LOCAL INFILE 'data.txt'
INTO TABLE test_table
PROPERTIES
(
"strict_mode" = "true"
);

Insert Into

SET enable_insert_strict = true;
INSERT INTO test_table ...;

Максимальная доля отфильтрованных данных (max_filter_ratio)​

Максимальная доля отфильтрованных данных (max_filter_ratio) является важным параметром управления загрузкой, который определяет максимально допустимую долю некорректных данных в общем объёме данных при загрузке:

  • Если фактическая доля отфильтрованных данных меньше заданного максимума, задание загрузки продолжается, а некорректные данные игнорируются.
  • Если фактическая доля отфильтрованных данных превышает заданный максимум, задание загрузки завершается ошибкой.

Расчёт доли отфильтрованных данных​

При загрузке строки данных делятся на следующие три категории:

КатегорияОписание
Отфильтрованные строкиСтроки, отфильтрованные из-за проблем с качеством данных. К таким проблемам относятся ошибки типов и точности, превышение допустимой длины строк, несоответствие количества столбцов в файлах и другие нарушения формата данных. Сюда также входят строки, отфильтрованные из-за отсутствия соответствующей партиции.
Неотобранные строкиСтроки данных, отфильтрованные условиями предварительной фильтрации или последующей фильтрации.
Загруженные строкиСтроки данных, загруженные корректно.

Доля отфильтрованных данных рассчитывается следующим образом:

#Filtered Rows / (#Filtered Rows + #Loaded Rows)

Иными словами, Unselected Rows не учитываются при расчёте доли отфильтрованных данных.

Настройка максимальной доли отфильтрованных данных​

Значение max_filter_ratio по умолчанию равно 0, то есть некорректные данные не допускаются. Ниже приведены примеры для различных способов загрузки:

Stream Load

curl --location-trusted -u user:passwd \
-H "max_filter_ratio: 0.1" \
-T data.txt \
http://host:port/api/example_db/my_table/_stream_load

Broker Load

LOAD LABEL example_db.label_1
(
DATA INFILE("s3://bucket/data.txt")
INTO TABLE test_table
)
WITH S3 (...)
PROPERTIES
(
"max_filter_ratio" = "0.1"
);

Routine Load

CREATE ROUTINE LOAD example_db.job1 ON test_table
PROPERTIES
(
"max_filter_ratio" = "0.1"
)
FROM KAFKA (...);

MySQL Load

LOAD DATA LOCAL INFILE 'data.txt'
INTO TABLE test_table
PROPERTIES
(
"max_filter_ratio" = "0.1"
);

Insert Into

SET insert_max_filter_ratio = 0.1;
INSERT INTO test_table FROM S3/HDFS/LOCAL();
подсказка

Для операторов Insert Into параметр insert_max_filter_ratio действует только при enable_insert_strict = false. Его значение по умолчанию равно 1.0, что позволяет отфильтровать все некорректные данные.

Часто задаваемые вопросы​

Вопрос 1: как использовать strict_mode и max_filter_ratio вместе?

  • Если вам требуется строгий контроль качества данных: задайте strict_mode = true и установите для max_filter_ratio небольшое значение (например, 0). Любая ошибка преобразования приводит к завершению загрузки с ошибкой.
  • Если вы хотите допускать небольшое количество грязных данных: отключите strict_mode (или оставьте значение по умолчанию) и задайте для max_filter_ratio приемлемую долю (например, 0.1). Некорректные данные отфильтровываются, не мешая загрузке в целом.

Вопрос 2: отфильтровывает ли строгий режим значения NULL, полученные при вычислении функций?

Нет. Строгий режим применяется только к случаю, когда «исходное значение не равно NULL, но после преобразования типа столбца результат равен NULL». Значения NULL, полученные при вычислении функций, не относятся к этой категории.

Вопрос 3: учитываются ли строки данных, отфильтрованные условиями предварительной или последующей фильтрации, при расчёте max_filter_ratio?

Нет. Unselected Rows не учитываются при расчёте доли отфильтрованных данных. Расчёт основан только на Filtered Rows и Loaded Rows.

Вопрос 4: как связаны enable_insert_strict и insert_max_filter_ratio в Insert Into?

insert_max_filter_ratio действует только при enable_insert_strict = false. Его значение по умолчанию равно 1.0, что позволяет отфильтровать все некорректные данные.

Вопрос 5: как различается обработка данных, превышающих допустимую длину столбца char(10), при включённом и отключённом строгом режиме?

  • Строгий режим включён: данные, превышающие допустимую длину, отфильтровываются.
  • Строгий режим отключён: данные, превышающие допустимую длину, усекаются и затем загружаются (например, a1234567890 усекается до a123456789).