CSV
В этом документе описано, как импортировать файлы данных в формате CSV в Apache Doris. Doris поддерживает гибкую настройку формата CSV, включая пользовательские разделители строк и столбцов, символы обрамления полей, символы экранирования, количество пропускаемых строк и форматы сжатия. Кроме того, доступны различные способы импорта для разных сценариев, таких как пакетная загрузка, потоковая загрузка в реальном времени и федеративные запросы.
Быстрая навигация
Перед началом работы выберите подходящий способ импорта с учётом источника данных и требований к оперативности их поступления, затем обратитесь к параметрам и примерам в соответствующем разделе:
- Небольшие локальные файлы, отправка по HTTP: используйте Stream Load
- Большие пакеты файлов в объектном хранилище / HDFS: используйте Broker Load
- Потоки данных из Kafka в реальном времени: используйте Routine Load
- Локальные файлы через клиент MySQL: используйте MySQL Load
- Выполнение запросов к файлам во внешних хранилищах или их загрузка напрямую через SQL: используйте S3 TVF или HDFS TVF
Поддерживаемые способы импорта
Doris предоставляет следующие способы импорта данных в формате CSV:
| Способ импорта | Сценарий использования | Документация |
|---|---|---|
| Stream Load | Отправка локальных файлов или данных из программы по HTTP | Stream Load |
| Broker Load | Пакетный импорт из удалённых хранилищ, таких как S3 / HDFS | Broker Load |
| Routine Load | Непрерывная подписка на данные из Kafka и их импорт | Routine Load |
| MySQL Load | Импорт локальных файлов по протоколу MySQL | MySQL Load |
| INSERT INTO FROM S3 TVF | Прямое чтение файлов из S3 и вставка данных в таблицу | S3 TVF |
| INSERT INTO FROM HDFS TVF | Прямое чтение файлов из HDFS и вставка данных в таблицу | HDFS TVF |
Параметры формата CSV
Матрица поддержки параметров для разных способов импорта
В следующей таблице приведены сведения о поддержке параметров формата CSV и соответствующем синтаксисе для разных способов импорта:
| Параметр | По умолчанию | Stream Load | Broker Load | Routine Load | MySQL Load | TVF |
|---|---|---|---|---|---|---|
| Разделитель строк | \n | line_delimiter | LINES TERMINATED BY | Не поддерживается | LINES TERMINATED BY | line_delimiter |
| Разделитель столбцов | \t | column_separator | COLUMNS TERMINATED BY | COLUMNS TERMINATED BY | COLUMNS TERMINATED BY | column_separator |
| Символ обрамления | Не задан | enclose | PROPERTIES.enclose | PROPERTIES.enclose | PROPERTIES.enclose | enclose |
| Символ экранирования | \ | escape | PROPERTIES.escape | PROPERTIES.escape | PROPERTIES.escape | escape |
| Пропуск строк | 0 | skip_lines | PROPERTIES.skip_lines | Не поддерживается | IGNORE LINES | skip_lines |
| Удаление двойных кавычек | false | trim_double_quotes | Не поддерживается | PROPERTIES.trim_double_quotes | Не поддерживается | trim_double_quotes |
| Формат сжатия | plain | compress_type | PROPERTIES.compress_type | Не поддерживается | Не поддерживается | compress_type |
- Stream Load: параметры задаются напрямую через заголовки HTTP, например:
-H "line_delimiter:\n" - Broker Load: параметры задаются в операторах SQL:
- Разделители задаются с помощью
COLUMNS TERMINATED BYиLINES TERMINATED BY - Остальные параметры задаются через
PROPERTIES, например:PROPERTIES("compress_type"="gz")
- Разделители задаются с помощью
- Routine Load: параметры задаются в операторах SQL:
- Разделители задаются с помощью
COLUMNS TERMINATED BY - Остальные параметры задаются через
PROPERTIES, например:PROPERTIES("enclose"="\"")
- Разделители задаются с помощью
- MySQL Load: параметры задаются в операторах SQL:
- Разделители задаются с помощью
LINES TERMINATED BYиCOLUMNS TERMINATED BY - Остальные параметры задаются через
PROPERTIES, например:PROPERTIES("escape"="\\")
- Разделители задаются с помощью
- TVF: параметры задаются в операторе TVF, например:
S3("line_delimiter"="\n")
Подробное описание параметров
Разделитель строк (line_delimiter)
- Назначение: задаёт символ перевода строки в импортируемом файле
- По умолчанию:
\n - Особенности: в качестве разделителя строк поддерживается сочетание нескольких символов
Типичные сценарии:
-
Файлы Linux/Unix:
Data file:
Zhang San, 25\n
Li Si, 30\n
Parameter setting:
line_delimiter: \n (default value, can be omitted) -
Файлы Windows:
Data file:
Zhang San, 25\r\n
Li Si, 30\r\n
Parameter setting:
line_delimiter: \r\n -
Файлы, созданные специализированными программами:
Data file:
Zhang San, 25\r
Li Si, 30\r
Parameter setting:
line_delimiter: \r -
Пользовательский разделитель из нескольких символов:
Data file:
Zhang San, 25||
Li Si, 30||
Parameter setting:
line_delimiter: ||
Разделитель столбцов (column_separator)
- Назначение: задаёт разделитель столбцов в импортируемом файле
- По умолчанию:
\t(табуляция) - Особенности:
- Поддерживаются как видимые, так и невидимые символы
- Поддерживаются сочетания нескольких символов
- Невидимые символы необходимо задавать в шестнадцатеричном виде с префиксом
\x
- Особенности обработки в протоколе MySQL:
- Для невидимых символов требуется дополнительная обратная косая черта
- Например, разделитель
\x01, используемый в Hive, в Broker Load нужно записывать как\\x01
Типичные сценарии:
-
Распространённые видимые символы:
Data file:
Zhang San, 25, Beijing
Li Si, 30, Shanghai
Parameter setting:
column_separator: , -
Табуляция (по умолчанию):
Data file:
Zhang San 25 Beijing
Li Si 30 Shanghai
Parameter setting:
column_separator: \t (default value, can be omitted) -
Файлы Hive (Stream Load):
Data file:
Zhang San\x0125\x01 Beijing
Li Si\x0130\x01 Shanghai
Parameter setting:
column_separator: \x01 -
Файлы Hive (Broker Load):
Data file:
Zhang San\x0125\x01 Beijing
Li Si\x0130\x01 Shanghai
Parameter setting:
PROPERTIES("column_separator"="\\x01") -
Разделитель из нескольких символов:
Data file:
Zhang San||25||Beijing
Li Si||30||Shanghai
Parameter setting:
column_separator: ||
Символ обрамления (enclose)
- Назначение: предотвращает неверный разбор полей, содержащих специальные символы
- Ограничение: поддерживаются только однобайтовые символы
- Распространённые символы:
- Одинарная кавычка:
' - Двойная кавычка:
"
- Одинарная кавычка:
Типичные сценарии:
-
Поле содержит разделитель столбцов:
Data: a,'b,c',d
Column separator: ,
Enclose: '
Parsing result: 3 fields [a] [b,c] [d] -
Поле содержит разделитель строк:
Data: a,'b\nc',d
Column separator: ,
Enclose: '
Parsing result: 3 fields [a] [b\nc] [d] -
Поле содержит и разделитель столбцов, и разделитель строк:
Data: a,'b,c\nd,e',f
Column separator: ,
Enclose: '
Parsing result: 3 fields [a] [b,c\nd,e] [f]
Символ экранирования (escape)
- Назначение: экранирует в поле символы, совпадающие с символом обрамления
- Ограничение: поддерживаются только однобайтовые символы. По умолчанию используется
\
Типичные сценарии:
-
Поле содержит символ обрамления:
Data: a,'b,\'c',d
Column separator: ,
Enclose: '
Escape: \
Parsing result: 3 fields [a] [b,'c] [d] -
Поле содержит несколько символов обрамления:
Data: a,"b,\"c\"d",e
Column separator: ,
Enclose: "
Escape: \
Parsing result: 3 fields [a] [b,"c"d] [e] -
Поле содержит сам символ экранирования:
Data: a,'b\\c',d
Column separator: ,
Enclose: '
Escape: \
Parsing result: 3 fields [a] [b\c] [d]
Пропуск строк (skip_lines)
- Назначение: пропускает первые N строк файла CSV
- Тип: целое число
- По умолчанию: 0
- Особые замечания:
- Если
formatимеет значениеcsv_with_names, система автоматически пропускает первую строку (имена столбцов) и игнорирует параметрskip_lines - Если
formatимеет значениеcsv_with_names_and_types, система автоматически пропускает первые две строки (имена и типы столбцов) и игнорирует параметрskip_lines
- Если
Типичные сценарии:
-
Пропуск строки заголовка:
Data file:
Name, Age, City
Zhang San, 25, Beijing
Li Si, 30, Shanghai
Parameter setting:
skip_lines: 1
Result: skip the header line and import the subsequent data -
Пропуск строк комментариев:
Data file:
# User information table
# Created at: 2024-01-01
Zhang San, 25, Beijing
Li Si, 30, Shanghai
Parameter setting:
skip_lines: 2
Result: skip the comment lines and import the subsequent data -
Использование формата csv_with_names:
Data file:
name,age,city
Zhang San, 25, Beijing
Li Si, 30, Shanghai
Parameter setting:
format: csv_with_names
Result: the system automatically skips the first line of column names -
Использование формата csv_with_names_and_types:
Data file:
name,age,city
string,int,string
Zhang San, 25, Beijing
Li Si, 30, Shanghai
Parameter setting:
format: csv_with_names_and_types
Result: the system automatically skips the first two lines of column names and types
Удаление двойных кавычек (trim_double_quotes)
- Назначение: удаляет внешние двойные кавычки из каждого поля файла CSV
- Тип: логический
- По умолчанию: false
Типичные сценарии:
-
Удаление двойных кавычек:
Data file:
"Zhang San","25","Beijing"
"Li Si","30","Shanghai"
Parameter setting:
trim_double_quotes: true
Result:
Zhang San, 25, Beijing
Li Si, 30, Shanghai
Формат сжатия (compress_type)
-
Назначение: задаёт формат сжатия импортируемого файла
-
Тип: строка, без учёта регистра
-
По умолчанию: plain
-
Поддерживаемые форматы сжатия:
Значение Описание plain Без сжатия (по умолчанию) bz2 Сжатие BZIP2 deflate Сжатие DEFLATE gz Сжатие GZIP lz4 Сжатие в формате LZ4 Frame lz4_block Сжатие в формате LZ4 Block lzo Сжатие LZO lzop Сжатие LZOP snappy_block Сжатие в формате SNAPPY Block -
Примечания:
- tar является форматом упаковки файлов, а не форматом сжатия, поэтому файлы
.tarне поддерживаются - Чтобы использовать файл, упакованный в tar, сначала распакуйте его, а затем выполните импорт
- tar является форматом упаковки файлов, а не форматом сжатия, поэтому файлы
Примеры
В этом разделе показаны три наиболее распространённые операции для каждого способа импорта: задание разделителей, обработка данных в кавычках и импорт сжатых файлов.
Stream Load
# Specify delimiters
curl --location-trusted -u root: \
-H "column_separator:," \
-H "line_delimiter:\n" \
-T example.csv \
http://<fe_host>:<fe_http_port>/api/test_db/test_table/_stream_load
# Handle quoted data
curl --location-trusted -u root: \
-H "column_separator:," \
-H "enclose:\"" \
-H "escape:\\" \
-T example.csv \
http://<fe_host>:<fe_http_port>/api/test_db/test_table/_stream_load
# Import a compressed file
curl --location-trusted -u root: \
-H "compress_type:gz" \
-T example.csv.gz \
http://<fe_host>:<fe_http_port>/api/test_db/test_table/_stream_load
Broker Load
-- Specify delimiters
LOAD LABEL test_db.test_label
(
DATA INFILE("s3://bucket/example.csv")
INTO TABLE test_table
COLUMNS TERMINATED BY ","
LINES TERMINATED BY "\n"
)
WITH S3
(
...
);
-- Handle quoted data
LOAD LABEL test_db.test_label
(
DATA INFILE("s3://bucket/example.csv")
INTO TABLE test_table
PROPERTIES
(
"enclose" = "\"",
"escape" = "\\"
)
)
WITH S3
(
...
);
-- Import a compressed file
LOAD LABEL test_db.test_label
(
DATA INFILE("s3://bucket/example.csv.gz")
INTO TABLE test_table
PROPERTIES
(
"compress_type" = "gz"
)
)
WITH S3
(
...
);
Routine Load
-- Specify delimiters
CREATE ROUTINE LOAD test_db.test_job ON test_table
COLUMNS TERMINATED BY ","
FROM KAFKA
(
...
);
-- Handle quoted data
CREATE ROUTINE LOAD test_db.test_job ON test_table
COLUMNS TERMINATED BY ","
PROPERTIES
(
"enclose" = "\"",
"escape" = "\\"
)
FROM KAFKA
(
...
);
MySQL Load
-- Specify delimiters
LOAD DATA LOCAL INFILE 'example.csv'
INTO TABLE test_table
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n';
-- Handle quoted data
LOAD DATA LOCAL INFILE 'example.csv'
INTO TABLE test_table
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n'
PROPERTIES
(
"enclose" = "\"",
"escape" = "\\"
);
-- Skip the header
LOAD DATA LOCAL INFILE 'example.csv'
INTO TABLE test_table
COLUMNS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
TVF
-- Specify delimiters
INSERT INTO test_table
SELECT *
FROM S3
(
"uri" = "s3://bucket/example.csv",
"format" = "csv",
"column_separator" = ",",
"line_delimiter" = "\n"
...
);
-- Handle quoted data
INSERT INTO test_table
SELECT *
FROM S3
(
"uri" = "s3://bucket/example.csv",
"format" = "csv",
"column_separator" = ",",
"enclose" = "\"",
"escape" = "\\"
...
);
-- Import a compressed file
INSERT INTO test_table
SELECT *
FROM S3
(
"uri" = "s3://bucket/example.csv.gz",
"format" = "csv",
"compress_type" = "gz"
...
);
Часто задаваемые вопросы
Вопрос 1: Почему разделитель столбцов \x01, используемый в Hive по умолчанию, не работает в Broker Load?
В протоколе MySQL для невидимых символов требуется дополнительная обратная косая черта, поэтому разделитель необходимо записывать как \\x01, например PROPERTIES("column_separator"="\\x01"). При задании через заголовок HTTP в Stream Load достаточно \x01.
Вопрос 2: Поддерживает ли Routine Load пользовательский разделитель строк?
Нет. Каждое сообщение, которое Routine Load получает из Kafka, само по себе соответствует одной строке, поэтому параметр line_delimiter не требуется и не поддерживается.
Вопрос 3: Первая строка файла CSV содержит заголовок. Как пропустить её при импорте?
- Stream Load / Broker Load / TVF: используйте
skip_lines=1 - MySQL Load: используйте
IGNORE 1 LINES - Если заголовок файла также соответствует соглашению
name1,name2,..., задайте дляformatзначениеcsv_with_names, и система автоматически пропустит первую строку. Задайте значениеcsv_with_names_and_types, чтобы автоматически пропустить первые две строки (имена и типы столбцов)
Вопрос 4: Можно ли напрямую импортировать файл .tar или .tar.gz?
Нет. tar является форматом упаковки, а не форматом сжатия. Doris поддерживает только форматы сжатия, перечисленные в описании compress_type. Сначала распакуйте файлы .tar или .tar.gz, а затем выполните импорт.
Вопрос 5: Поле содержит и разделитель столбцов, и перевод строки. Как его обработать?
Задайте enclose для этого поля. Например, при использовании одинарных кавычек в качестве символа обрамления строка a,'b,c\nd,e',f корректно разбирается на 3 поля [a], [b,c\nd,e], [f], если разделитель столбцов задан как ,, а символ обрамления как '. Если поле также содержит сам символ обрамления, используйте этот параметр вместе с escape.
Вопрос 6: Как удалить внешние двойные кавычки при импорте полей, заключённых в двойные кавычки?
Задайте для trim_double_quotes значение true, и Doris автоматически удалит внешние двойные кавычки из каждого поля после разбора. Этот параметр поддерживается в Stream Load, Routine Load и TVF, но не поддерживается в Broker Load и MySQL Load.