ClickHouse/docs/ru/sql-reference/table-functions/file.md
2022-04-09 07:29:05 -06:00

5.7 KiB
Raw Blame History

sidebar_position sidebar_label
37 file

file

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

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

Синтаксис

file(path, format, structure)

Параметры

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

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

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

Примеры

Настройка 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.

Пример

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

  • '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');

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

Пример

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

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

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

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

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