Skip to main content

file

Создаёт таблицу из файла. Данная табличная функция похожа на табличные функции url и hdfs.

Функция file может использоваться в запросах SELECT и INSERT при работе с движком таблиц File.

Синтаксис

file(path [,format] [,structure] [,compression])

Параметры

  • path — относительный путь до файла от user_files_path. Путь к файлу поддерживает следующие шаблоны в режиме доступа только для чтения *, ?, {abc,def} и {N..M}, где N, M — числа, 'abc', 'def' — строки.
  • formatформат файла.
  • structure — структура таблицы. Формат: 'colunmn1_name column1_ype, column2_name column2_type, ...'.
  • compression — Используемый тип сжатия для запроса SELECT или желаемый тип сжатия для запроса INSERT. Поддерживаемые типы сжатия: gz, br, xz, zst, lz4 и bz2.

Возвращаемое значение

Таблица с указанной структурой, предназначенная для чтения или записи данных в указанном файле.

Примеры

Настройка user_files_path и содержимое файла test.csv:

$ grep user_files_path /etc/clickhouse-server/config.xml
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>

$ cat /var/lib/clickhouse/user_files/test.csv
1,2,3
3,2,1
78,43,45

Получение данных из таблицы в файле test.csv и выборка первых двух строк из неё:

SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') LIMIT 2;
┌─column1─┬─column2─┬─column3─┐
│ 1 │ 2 │ 3 │
│ 3 │ 2 │ 1 │
└─────────┴─────────┴─────────┘

Получение первых 10 строк таблицы, содержащей 3 столбца типа UInt32, из CSV-файла:

SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') LIMIT 10;

Вставка данных из файла в таблицу:

INSERT INTO FUNCTION file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32') VALUES (1, 2, 3), (3, 2, 1);
SELECT * FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32');
┌─column1─┬─column2─┬─column3─┐
│ 1 │ 2 │ 3 │
│ 3 │ 2 │ 1 │
└─────────┴─────────┴─────────┘

Шаблоны поиска в компонентах пути

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

  • * — заменяет любое количество любых символов кроме /, включая отсутствие символов.
  • ** — Заменяет любое количество любых символов, включая /, то есть осуществляет рекурсивный поиск по вложенным директориям.
  • ? — заменяет ровно один любой символ.
  • {some_string,another_string,yet_another_one} — заменяет любую из строк 'some_string', 'another_string', 'yet_another_one'. Эти строки также могут содержать символ /.
  • {N..M} — заменяет любое число в интервале от N до M включительно (может содержать ведущие нули).

Конструкция с {} аналогична табличным функциям remote, hdfs.

Пример

Предположим, у нас есть несколько файлов со следующими относительными путями:

  • 'some_dir/some_file_1'
  • 'some_dir/some_file_2'
  • 'some_dir/some_file_3'
  • 'another_dir/some_file_1'
  • 'another_dir/some_file_2'
  • 'another_dir/some_file_3'

Запросим количество строк в этих файлах:

SELECT count(*) FROM file('{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32');

Запросим количество строк во всех файлах этих двух директорий:

SELECT count(*) FROM file('{some,another}_dir/*', 'TSV', 'name String, value UInt32');
Предупреждение

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

Пример

Запрос данных из файлов с именами file000, file001, ... , file999:

SELECT count(*) FROM file('big_dir/file{0..9}{0..9}{0..9}', 'CSV', 'name String, value UInt32');

Виртуальные столбцы

  • _path — путь к файлу.
  • _file — имя файла.

Смотрите также