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

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Отправка локальных файлов или данных из программы по HTTPStream Load
Broker LoadПакетный импорт из удалённых хранилищ, таких как S3 / HDFSBroker Load
Routine LoadНепрерывная подписка на данные из Kafka и их импортRoutine Load
MySQL LoadИмпорт локальных файлов по протоколу MySQLMySQL Load
INSERT INTO FROM S3 TVFПрямое чтение файлов из S3 и вставка данных в таблицуS3 TVF
INSERT INTO FROM HDFS TVFПрямое чтение файлов из HDFS и вставка данных в таблицуHDFS TVF

Параметры формата CSV​

Матрица поддержки параметров для разных способов импорта​

В следующей таблице приведены сведения о поддержке параметров формата CSV и соответствующем синтаксисе для разных способов импорта:

ПараметрПо умолчаниюStream LoadBroker LoadRoutine LoadMySQL LoadTVF
Разделитель строк\nline_delimiterLINES TERMINATED BYНе поддерживаетсяLINES TERMINATED BYline_delimiter
Разделитель столбцов\tcolumn_separatorCOLUMNS TERMINATED BYCOLUMNS TERMINATED BYCOLUMNS TERMINATED BYcolumn_separator
Символ обрамленияНе заданenclosePROPERTIES.enclosePROPERTIES.enclosePROPERTIES.encloseenclose
Символ экранирования\escapePROPERTIES.escapePROPERTIES.escapePROPERTIES.escapeescape
Пропуск строк0skip_linesPROPERTIES.skip_linesНе поддерживаетсяIGNORE LINESskip_lines
Удаление двойных кавычекfalsetrim_double_quotesНе поддерживаетсяPROPERTIES.trim_double_quotesНе поддерживаетсяtrim_double_quotes
Формат сжатияplaincompress_typePROPERTIES.compress_typeНе поддерживаетсяНе поддерживаетсяcompress_type
Синтаксис параметров для каждого способа импорта
  1. Stream Load: параметры задаются напрямую через заголовки HTTP, например: -H "line_delimiter:\n"
  2. Broker Load: параметры задаются в операторах SQL:
    • Разделители задаются с помощью COLUMNS TERMINATED BY и LINES TERMINATED BY
    • Остальные параметры задаются через PROPERTIES, например: PROPERTIES("compress_type"="gz")
  3. Routine Load: параметры задаются в операторах SQL:
    • Разделители задаются с помощью COLUMNS TERMINATED BY
    • Остальные параметры задаются через PROPERTIES, например: PROPERTIES("enclose"="\"")
  4. MySQL Load: параметры задаются в операторах SQL:
    • Разделители задаются с помощью LINES TERMINATED BY и COLUMNS TERMINATED BY
    • Остальные параметры задаются через PROPERTIES, например: PROPERTIES("escape"="\\")
  5. 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, сначала распакуйте его, а затем выполните импорт

Примеры​

В этом разделе показаны три наиболее распространённые операции для каждого способа импорта: задание разделителей, обработка данных в кавычках и импорт сжатых файлов.

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.