Обработка некорректных данных
В процессе загрузки типы данных исходных и целевых столбцов могут не совпадать. 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 | \N | NULL | Включён или отключён | NULL |
| Значение, отличное от NULL | "abc" или 2000 | NULL | Включён | Недопустимое значение (отфильтровано) |
| Значение, отличное от NULL | "abc" или 2000 | NULL | Отключён | NULL |
| Значение, отличное от NULL | 1 | 1 | Включён или отключён | Загружено корректно |
- Столбцы таблицы допускают загрузку значений NULL.
- После преобразования в
TinyIntзначенияabcи2000становятсяNULLиз-за несоответствия типа или точности. Если строгий режим включён, такие данные отфильтровываются; если отключён, загружаетсяNULL.
Пример 2: столбец типа Decimal(1,0)
| Тип исходных данных | Пример исходных данных | Значение после преобразования в Decimal | Строгий режим | Результат |
|---|---|---|---|---|
| Значение NULL | \N | NULL | Включён или отключён | NULL |
| Значение, отличное от NULL | aaa | NULL | Включён | Недопустимое значение (отфильтровано) |
| Значение, отличное от NULL | aaa | NULL | Отключён | NULL |
| Значение, отличное от NULL | 10 | NULL (переполнение) | Включён | Отфильтровано |
| Значение, отличное от NULL | 10 | NULL (переполнение) | Отключён | NULL |
- Столбцы таблицы допускают загрузку значений NULL.
- После преобразования в
DecimalзначениеaaaстановитсяNULLиз-за несоответствия типа. Если строгий режим включён, такие данные отфильтровываются; если отключён, загружаетсяNULL. 10выходит за диапазонDecimal(1, 0)и преобразуется вNULL. Если строгий режим включён, это значение отфильтровывается; если отключён, загружаетсяNULL.
Пример 3: столбец типа char(10)
| Тип исходных данных | Пример исходных данных | Значение после преобразования в char(10) | Строгий режим | Результат |
|---|---|---|---|---|
| Значение NULL | \N | NULL | Включён или отключён | NULL |
| Значение, отличное от NULL | a1234567890 | a1234567890 | Включён | Превышена допустимая длина, отфильтровано |
| Значение, отличное от NULL | a1234567890 | a1234567890 | Отключён | 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).