Работа с данными CSV и TSV в ClickHouse
ClickHouse поддерживает импорт данных из файлов CSV и экспорт данных в формат CSV. Поскольку файлы CSV могут иметь различные особенности формата, включая строки заголовков, пользовательские разделители и символы экранирования, ClickHouse предоставляет форматы и настройки для эффективного решения каждой из этих задач.
Импорт данных из CSV файла
Перед импортом данных давайте создадим таблицу с соответствующей структурой:
Чтобы импортировать данные из CSV файла в таблицу sometable
, мы можем передать наш файл напрямую в clickhouse-client:
Обратите внимание, что мы используем FORMAT CSV, чтобы сообщить ClickHouse, что мы загружаем данные в формате CSV. В качестве альтернативы мы можем загрузить данные из локального файла, используя оператор FROM INFILE:
Здесь мы используем оператор FORMAT CSV
, чтобы ClickHouse понимал формат файла. Мы также можем загружать данные непосредственно из URL, используя функцию url() или из файлов S3, используя функцию s3().
Мы можем пропустить явную настройку формата для file()
и INFILE
/OUTFILE
.
В этом случае ClickHouse автоматически определит формат на основе расширения файла.
CSV файлы с заголовками
Предположим, что наш CSV файл содержит заголовки:
Чтобы импортировать данные из этого файла, мы можем использовать формат CSVWithNames:
В этом случае ClickHouse пропустит первую строку при импорте данных из файла.
Начиная с версии 23.1, ClickHouse автоматически будет определять заголовки в файлах CSV при использовании формата CSV
, поэтому нет необходимости использовать CSVWithNames
или CSVWithNamesAndTypes
.
CSV файлы с пользовательскими разделителями
Если файл CSV использует разделитель, отличный от запятой, мы можем использовать опцию format_csv_delimiter для установки соответствующего символа:
Теперь, когда мы импортируем из CSV файла, символ ;
будет использоваться в качестве разделителя вместо запятой.
Пропуск строк в CSV файле
Иногда нам может понадобиться пропустить определенное количество строк при импорте данных из CSV файла. Это можно сделать с помощью опции input_format_csv_skip_first_lines:
В этом случае мы собираемся пропустить первые десять строк из файла CSV:
Файл file содержит 1k строк, но ClickHouse загрузил только 990, так как мы попросили пропустить первые 10.
При использовании функции file()
, с ClickHouse Cloud вам потребуется выполнять команды в clickhouse client
на машине, где находится файл. Другой вариант — использовать clickhouse-local
для изучения файлов локально.
Обработка значений NULL в CSV файлах
Значения NULL могут быть закодированы по-разному в зависимости от приложения, которое сгенерировало файл. По умолчанию ClickHouse использует \N
как значение NULL в CSV. Но мы можем изменить это, используя опцию format_csv_null_representation.
Предположим, у нас есть следующий CSV файл:
Если мы загрузим данные из этого файла, ClickHouse будет рассматривать Nothing
как строку (что правильно):
Если мы хотим, чтобы ClickHouse рассматривал Nothing
как NULL
, мы можем определить это с помощью следующей опции:
Теперь у нас есть NULL
, где мы этого ожидаем:
TSV (разделенные табуляцией) файлы
Формат данных, разделенных табуляцией, широко используется в качестве формата обмена данными. Чтобы загрузить данные из TSV файла в ClickHouse, используется формат TabSeparated:
Также существует формат TabSeparatedWithNames для работы с TSV файлами, содержащими заголовки. И, как для CSV, мы можем пропустить первые X строк, используя опцию input_format_tsv_skip_first_lines.
Необработанные TSV
Иногда TSV файлы сохраняются без экранирования табуляций и переносов строк. Мы должны использовать TabSeparatedRaw для обработки таких файлов.
Экспорт в CSV
Любой из форматов, упомянутых в наших предыдущих примерах, также может быть использован для экспорта данных. Чтобы экспортировать данные из таблицы (или запроса) в формат CSV, мы используем тот же оператор FORMAT
:
Чтобы добавить заголовок в CSV файл, мы используем формат CSVWithNames:
Сохранение экспортированных данных в CSV файл
Чтобы сохранить экспортированные данные в файл, мы можем использовать оператор INTO...OUTFILE:
Обратите внимание, что ClickHouse потребовалось ~1 секунда, чтобы сохранить 36m строк в CSV файл.
Экспорт CSV с пользовательскими разделителями
Если мы хотим использовать разделители, отличные от запятой, для этого мы можем использовать опцию настройки format_csv_delimiter:
Теперь ClickHouse будет использовать |
в качестве разделителя для формата CSV:
Экспорт CSV для Windows
Если мы хотим, чтобы CSV файл корректно работал в среде Windows, мы должны рассмотреть возможность включения опции output_format_csv_crlf_end_of_line. Это будет использовать \r\n
в качестве переносов строк вместо \n
:
Вывод схемы для CSV файлов
В многих случаях мы можем работать с неизвестными файлами CSV, поэтому нам нужно исследовать, какие типы использовать для столбцов. ClickHouse по умолчанию попытается угадать форматы данных на основе своего анализа данного CSV файла. Это называется "Вывод схемы". Обнаруженные типы данных можно изучить, используя оператор DESCRIBE
в паре с функцией file():
Здесь ClickHouse эффективно смог угадать типы столбцов для нашего CSV файла. Если мы не хотим, чтобы ClickHouse угадывал, мы можем отключить это с помощью следующей опции:
Все типы столбцов в этом случае будут рассматриваться как String
.
Экспорт и импорт CSV с явными типами столбцов
ClickHouse также позволяет явно задавать типы столбцов при экспорте данных, используя CSVWithNamesAndTypes (и другие форматы из семейства *WithNames):
Этот формат будет включать две строки заголовков - одну с именами столбцов и другую с типами столбцов. Это позволит ClickHouse (и другим приложениям) определять типы столбцов при загрузке данных из таких файлов:
Теперь ClickHouse идентифицирует типы столбцов на основе (второй) строки заголовка вместо того, чтобы угадывать.
Пользовательские разделители, разделители и правила экранирования
В сложных случаях текстовые данные могут быть отформатированы в высоко настроенном виде, но при этом оставаться структурированными. ClickHouse имеет специальный формат CustomSeparated для таких случаев, который позволяет устанавливать пользовательские правила экранирования, разделители, разделители строк и символы начала/конца.
Предположим, у нас есть следующие данные в файле:
Мы можем видеть, что отдельные строки обернуты в row()
, строки разделяются с помощью ,
, а отдельные значения разделены ;
. В этом случае мы можем использовать следующие настройки для чтения данных из этого файла:
Теперь мы можем загружать данные из нашего пользовательского файла:
Мы также можем использовать CustomSeparatedWithNames, чтобы заголовки экспортировались и импортировались корректно. Изучите форматы regex и template, чтобы справляться с еще более сложными случаями.
Работа с большими файлами CSV
CSV файлы могут быть большими, и ClickHouse работает эффективно с файлами любого размера. Большие файлы обычно поставляются в сжатом виде, и ClickHouse обрабатывает это без необходимости разжатия перед обработкой. Мы можем использовать оператор COMPRESSION
во время вставки:
Если оператор COMPRESSION
пропущен, ClickHouse все равно будет пытаться угадать сжатие файла на основе его расширения. Тот же подход можно использовать для экспорта файлов напрямую в сжатые форматы:
Это создаст сжатый файл data_csv.csv.gz
.
Другие форматы
ClickHouse вводит поддержку многих форматов, как текстовых, так и бинарных, чтобы охватить различные сценарии и платформы. Изучите больше форматов и способы работы с ними в следующих статьях:
- Форматы CSV и TSV
- Parquet
- Форматы JSON
- Regex и шаблоны
- Нативные и бинарные форматы
- SQL форматы
И также ознакомьтесь с clickhouse-local - портативным полноценным инструментом для работы с локальными/удалёнными файлами без необходимости в сервере ClickHouse.