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

hdfsCluster Табличная Функция

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

Синтаксис

hdfsCluster(cluster_name, URI, format, structure)

Аргументы

АргументОписание
cluster_nameИмя кластера, которое используется для построения набора адресов и параметров соединения с удаленными и локальными серверами.
URIURI к файлу или группе файлов. Поддерживает следующие подстановочные знаки в режиме только для чтения: *, **, ?, {'abc','def'} и {N..M}, где N, M — числа, abc, def — строки. Для получения дополнительной информации см. Подстановочные знаки в пути.
formatформат файла.
structureСтруктура таблицы. Формат 'имя_колонки1 тип_колонки1, имя_колонки2 тип_колонки2, ...'.

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

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

Примеры

  1. Предположим, что у нас есть кластер ClickHouse с именем cluster_simple и несколько файлов со следующими URI в HDFS:
  • 'hdfs://hdfs1:9000/some_dir/some_file_1'
  • 'hdfs://hdfs1:9000/some_dir/some_file_2'
  • 'hdfs://hdfs1:9000/some_dir/some_file_3'
  • 'hdfs://hdfs1:9000/another_dir/some_file_1'
  • 'hdfs://hdfs1:9000/another_dir/some_file_2'
  • 'hdfs://hdfs1:9000/another_dir/some_file_3'
  1. Запросите количество строк в этих файлах:
SELECT count(*)
FROM hdfsCluster('cluster_simple', 'hdfs://hdfs1:9000/{some,another}_dir/some_file_{1..3}', 'TSV', 'name String, value UInt32')
  1. Запросите количество строк во всех файлах этих двух директорий:
SELECT count(*)
FROM hdfsCluster('cluster_simple', 'hdfs://hdfs1:9000/{some,another}_dir/*', 'TSV', 'name String, value UInt32')
примечание

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