Словари
Словарь — это отображение (key -> attributes), удобное для различных типов справочных списков.
ClickHouse поддерживает специальные функции для работы со словарями, которые можно использовать в запросах. Использовать словари с функциями проще и эффективнее, чем JOIN со справочными таблицами.
ClickHouse поддерживает:
- Словари с набором функций.
- Встроенные словари с определённым набором функций.
Если вы только начинаете работать со словарями в ClickHouse, у нас есть руководство, посвящённое этой теме. Ознакомьтесь с ним здесь.
Вы можете добавлять собственные словари из различных источников данных. Источником для словаря может быть таблица ClickHouse, локальный текстовый или исполняемый файл, ресурс HTTP(s) или другая СУБД. Для получения дополнительной информации см. раздел «Источники словарей».
ClickHouse:
- Полностью или частично хранит словари в оперативной памяти (RAM).
- Периодически обновляет словари и динамически загружает отсутствующие значения. Другими словами, словари могут загружаться динамически.
- Позволяет создавать словари с помощью XML-файлов или DDL-запросов.
Конфигурация словарей может быть расположена в одном или нескольких XML-файлах. Путь к конфигурации задаётся параметром dictionaries_config.
Словари могут загружаться при запуске сервера или при первом использовании, в зависимости от настройки dictionaries_lazy_load.
Системная таблица dictionaries содержит информацию о словарях, настроенных на сервере. Для каждого словаря вы можете найти там:
- Статус словаря.
- Параметры конфигурации.
- Метрики, такие как объём RAM, выделенный для словаря, или количество запросов с момента успешной загрузки словаря.
Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.
Создание словаря с помощью DDL-запроса
Словари можно создавать с помощью DDL-запросов, и это рекомендуемый способ, поскольку у словарей, созданных с помощью DDL:
- В конфигурационные файлы сервера не добавляются дополнительные записи.
- Со словарями можно работать как с полноправными сущностями, подобно таблицам или представлениям.
- Данные можно читать напрямую, используя привычный SELECT, а не табличные функции для словарей. Обратите внимание, что при непосредственном доступе к словарю через оператор SELECT кэшируемый словарь вернёт только данные, уже находящиеся в кэше, тогда как некэшируемый словарь вернёт все данные, которые он хранит.
- Словари можно легко переименовывать.
Создание словаря с помощью файла конфигурации
Создание словаря с помощью файла конфигурации в ClickHouse Cloud не поддерживается. Пожалуйста, используйте DDL (см. выше) и создайте словарь от имени пользователя default.
Файл конфигурации словаря имеет следующий формат:
Вы можете настроить любое количество словарей в одном файле.
Вы можете преобразовать значения для небольшого словаря, описав его в запросе SELECT (см. функцию transform). Данная функциональность не относится к словарям.
Настройка словаря
Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.
Если словарь настраивается с помощью XML-файла, конфигурация словаря имеет следующую структуру:
Соответствующий DDL-запрос имеет следующую структуру:
Хранение словарей в памяти
Существует несколько способов хранения словарей в памяти.
Мы рекомендуем flat, hashed и complex_key_hashed, которые обеспечивают оптимальную скорость обработки.
Кэширование не рекомендуется из-за потенциально низкой производительности и сложности подбора оптимальных параметров. Подробнее см. в разделе cache.
Существует несколько способов повысить производительность словарей:
- Вызывайте функцию для работы со словарём после
GROUP BY. - Помечайте извлекаемые атрибуты как инъективные. Атрибут называется инъективным, если разным ключам соответствуют разные значения атрибута. Поэтому, когда
GROUP BYиспользует функцию, извлекающую значение атрибута по ключу, эта функция автоматически выносится изGROUP BY.
ClickHouse генерирует исключение при ошибках, связанных со словарями. Примеры ошибок:
- Не удалось загрузить словарь, к которому выполняется обращение.
- Ошибка при запросе к словарю типа
cached.
Вы можете посмотреть список словарей и их статусы в таблице system.dictionaries.
Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.
Конфигурация выглядит следующим образом:
Соответствующий DDL-запрос:
Словари, в названии макета которых отсутствует слово complex-key*, имеют ключ типа UInt64, словари с макетом complex-key* используют составной ключ (complex, с произвольными типами).
Ключи UInt64 в XML-словарях задаются с помощью тега <id>.
Пример конфигурации (столбец key_column имеет тип UInt64):
Составные ключи типа complex в XML-словарях определяются с помощью тега <key>.
Пример конфигурации составного ключа (ключ имеет один элемент типа String):
Способы хранения словарей в памяти
Различные способы хранения данных словаря в памяти связаны с компромиссами по потреблению CPU и RAM. Дерево решений, опубликованное в разделе Choosing a Layout статьи в блоге, посвящённой словарям, является хорошей отправной точкой для выбора подходящего типа размещения.
- flat
- hashed
- sparse_hashed
- complex_key_hashed
- complex_key_sparse_hashed
- hashed_array
- complex_key_hashed_array
- range_hashed
- complex_key_range_hashed
- cache
- complex_key_cache
- ssd_cache
- complex_key_ssd_cache
- direct
- complex_key_direct
- ip_trie
flat
Словарь полностью хранится в памяти в виде плоских массивов. Сколько памяти использует словарь? Объём пропорционален значению наибольшего ключа (в занимаемом им пространстве).
Ключ словаря имеет тип UInt64, а значение ограничено max_array_size (по умолчанию — 500,000). Если при создании словаря обнаруживается ключ с большим значением, ClickHouse генерирует исключение и не создаёт словарь. Начальный размер плоских массивов словаря задаётся настройкой initial_array_size (по умолчанию — 1024).
Поддерживаются все типы источников. При обновлении данные (из файла или таблицы) читаются целиком.
Этот метод обеспечивает наилучшую производительность среди всех доступных методов хранения словаря.
Пример конфигурации:
или
hashed
Словарь полностью хранится в памяти в виде хеш-таблицы. Словарь может содержать любое количество элементов с произвольными идентификаторами. На практике количество ключей может достигать десятков миллионов.
Ключ словаря имеет тип UInt64.
Поддерживаются все типы источников. При обновлении данные (из файла или из таблицы) считываются целиком.
Пример конфигурации:
или
Пример конфигурации:
или
sparse_hashed
Похожа на hashed, но использует меньше памяти за счёт большего потребления ресурсов CPU.
Ключ словаря имеет тип UInt64.
Пример конфигурации:
или
Для этого типа словаря также можно использовать shards, и опять же это более важно для sparse_hashed, чем для hashed, так как sparse_hashed работает медленнее.
complex_key_hashed
Этот тип хранения словаря предназначен для использования с составными ключами. Аналогичен типу hashed.
Пример конфигурации:
или
complex_key_sparse_hashed
Этот тип хранилища предназначен для использования с составными ключами. Аналогичен sparse_hashed.
Пример конфигурации:
или
hashed_array
Словарь полностью хранится в памяти. Каждый атрибут хранится в массиве. Атрибут-ключ хранится в виде хеш-таблицы, где значение — это индекс в массиве атрибутов. Словарь может содержать любое количество элементов с любыми идентификаторами. На практике число ключей может достигать десятков миллионов.
Ключ словаря имеет тип UInt64.
Поддерживаются все типы источников. При обновлении данные (из файла или из таблицы) читаются целиком.
Пример конфигурации:
или
complex_key_hashed_array
Этот тип хранилища предназначен для использования с составными ключами. Аналогичен hashed_array.
Пример конфигурации:
или
range_hashed
Словарь хранится в памяти в виде хеш-таблицы с упорядоченным массивом диапазонов и соответствующими им значениями.
Ключ словаря имеет тип UInt64.
Этот способ хранения работает так же, как словарь типа hashed, и позволяет использовать диапазоны значений даты/времени (любого числового типа) в дополнение к ключу.
Пример: таблица содержит скидки для каждого рекламодателя в формате:
Чтобы использовать выборку по диапазонам дат, определите элементы range_min и range_max в структуре. Эти элементы должны содержать элементы name и type (если type не указан, по умолчанию используется тип Date). type может быть любым числовым типом (Date / DateTime / UInt64 / Int32 / другие).
Значения range_min и range_max должны умещаться в диапазон типа Int64.
Пример:
или
Чтобы работать с этими словарями, необходимо передать функции dictGet дополнительный аргумент, для которого задаётся диапазон:
Пример запроса:
Эта функция возвращает значение для указанных id и диапазона дат, охватывающего переданную дату.
Подробности алгоритма:
- Если
idне найден или дляidне найден диапазон, возвращается значение по умолчанию для типа атрибута. - Если есть пересекающиеся диапазоны и
range_lookup_strategy=min, возвращается подходящий диапазон с минимальнымrange_min; если найдено несколько таких диапазонов, возвращается диапазон с минимальнымrange_max; если снова найдено несколько диапазонов (несколько диапазонов имеют одинаковыеrange_minиrange_max), возвращается случайный диапазон из них. - Если есть пересекающиеся диапазоны и
range_lookup_strategy=max, возвращается подходящий диапазон с максимальнымrange_min; если найдено несколько таких диапазонов, возвращается диапазон с максимальнымrange_max; если снова найдено несколько диапазонов (несколько диапазонов имеют одинаковыеrange_minиrange_max), возвращается случайный диапазон из них. - Если
range_maxравенNULL, диапазон считается открытым.NULLтрактуется как максимально возможное значение. Дляrange_minв качестве открытого значения могут использоваться1970-01-01или0(-MAX_INT).
Пример конфигурации:
или
Пример конфигурации с перекрывающимися и открытыми диапазонами:
INSERT INTO discounts VALUES (1, '2015-01-01', Null, 0.1); INSERT INTO discounts VALUES (1, '2015-01-15', Null, 0.2); INSERT INTO discounts VALUES (2, '2015-01-01', '2015-01-15', 0.3); INSERT INTO discounts VALUES (2, '2015-01-04', '2015-01-10', 0.4); INSERT INTO discounts VALUES (3, '1970-01-01', '2015-01-15', 0.5); INSERT INTO discounts VALUES (3, '1970-01-01', '2015-01-10', 0.6);
SELECT * FROM discounts ORDER BY advertiser_id, discount_start_date; ┌─advertiser_id─┬─discount_start_date─┬─discount_end_date─┬─amount─┐ │ 1 │ 2015-01-01 │ ᴺᵁᴸᴸ │ 0.1 │ │ 1 │ 2015-01-15 │ ᴺᵁᴸᴸ │ 0.2 │ │ 2 │ 2015-01-01 │ 2015-01-15 │ 0.3 │ │ 2 │ 2015-01-04 │ 2015-01-10 │ 0.4 │ │ 3 │ 1970-01-01 │ 2015-01-15 │ 0.5 │ │ 3 │ 1970-01-01 │ 2015-01-10 │ 0.6 │ └───────────────┴─────────────────────┴───────────────────┴────────┘
-- RANGE_LOOKUP_STRATEGY 'max'
CREATE DICTIONARY discounts_dict ( advertiser_id UInt64, discount_start_date Date, discount_end_date Nullable(Date), amount Float64 ) PRIMARY KEY advertiser_id SOURCE(CLICKHOUSE(TABLE discounts)) LIFETIME(MIN 600 MAX 900) LAYOUT(RANGE_HASHED(RANGE_LOOKUP_STRATEGY 'max')) RANGE(MIN discount_start_date MAX discount_end_date);
select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-14')) res; ┌─res─┐ │ 0.1 │ -- совпадает только один диапазон: 2015-01-01 – Null └─────┘
select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-16')) res; ┌─res─┐ │ 0.2 │ -- совпадают два диапазона, range_min 2015-01-15 (0.2) больше, чем 2015-01-01 (0.1) └─────┘
select dictGet('discounts_dict', 'amount', 2, toDate('2015-01-06')) res; ┌─res─┐ │ 0.4 │ -- совпадают два диапазона, range_min 2015-01-04 (0.4) больше, чем 2015-01-01 (0.3) └─────┘
select dictGet('discounts_dict', 'amount', 3, toDate('2015-01-01')) res; ┌─res─┐ │ 0.5 │ -- совпадают два диапазона, значения range_min равны; 2015-01-15 (0.5) больше, чем 2015-01-10 (0.6) └─────┘
DROP DICTIONARY discounts_dict;
-- RANGE_LOOKUP_STRATEGY 'min'
CREATE DICTIONARY discounts_dict ( advertiser_id UInt64, discount_start_date Date, discount_end_date Nullable(Date), amount Float64 ) PRIMARY KEY advertiser_id SOURCE(CLICKHOUSE(TABLE discounts)) LIFETIME(MIN 600 MAX 900) LAYOUT(RANGE_HASHED(RANGE_LOOKUP_STRATEGY 'min')) RANGE(MIN discount_start_date MAX discount_end_date);
select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-14')) res; ┌─res─┐ │ 0.1 │ -- совпадает только один диапазон: 2015-01-01 – Null └─────┘
select dictGet('discounts_dict', 'amount', 1, toDate('2015-01-16')) res; ┌─res─┐ │ 0.1 │ -- совпадают два диапазона, range_min 2015-01-01 (0.1) меньше чем 2015-01-15 (0.2) └─────┘
select dictGet('discounts_dict', 'amount', 2, toDate('2015-01-06')) res; ┌─res─┐ │ 0.3 │ -- совпадают два диапазона, range_min 2015-01-01 (0.3) меньше чем 2015-01-04 (0.4) └─────┘
select dictGet('discounts_dict', 'amount', 3, toDate('2015-01-01')) res; ┌─res─┐ │ 0.6 │ -- совпадают два диапазона, значения range_min равны, 2015-01-10 (0.6) меньше чем 2015-01-15 (0.5) └─────┘
cache
Словарь хранится в кэше с фиксированным количеством ячеек. Эти ячейки содержат часто используемые элементы.
Ключ словаря имеет тип UInt64.
При обращении к словарю сначала производится поиск в кэше. Для каждого блока данных все ключи, которые не найдены в кэше или устарели, запрашиваются из источника с помощью SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...). Полученные данные затем записываются в кэш.
Если часть ключей не найдена в словаре, создаётся задача обновления кэша и добавляется в очередь обновлений. Свойствами очереди обновлений можно управлять с помощью настроек max_update_queue_size, update_queue_push_timeout_milliseconds, query_wait_timeout_milliseconds, max_threads_for_updates.
Для словарей типа cache можно задать время жизни (lifetime) данных в кэше. Если с момента загрузки данных в ячейку прошло больше времени, чем lifetime, значение ячейки не используется, и ключ считается просроченным. Ключ будет повторно запрошен при следующем обращении. Такое поведение можно настроить с помощью параметра allow_read_expired_keys.
Это наименее эффективный из всех способов хранения словарей. Производительность кэша сильно зависит от корректных настроек и сценариев использования. Словарь типа cache работает хорошо только при достаточно высоком уровне попаданий (рекомендуется 99% и выше). Средний уровень попаданий можно посмотреть в таблице system.dictionaries.
Если настройка allow_read_expired_keys установлена в 1 (по умолчанию 0), словарь может поддерживать асинхронные обновления. Если клиент запрашивает ключи и все они находятся в кэше, но некоторые из них просрочены, словарь вернёт клиенту просроченные значения и асинхронно запросит их из источника.
Для повышения производительности кэша используйте подзапрос с LIMIT и вызывайте функцию, использующую словарь, снаружи.
Поддерживаются все типы источников.
Пример настроек:
или
Задайте достаточно большой размер кэша. Необходимо поэкспериментировать, чтобы подобрать количество ячеек:
- Задайте некоторое значение.
- Выполняйте запросы, пока кэш полностью не заполнится.
- Оцените потребление памяти с помощью таблицы
system.dictionaries. - Увеличивайте или уменьшайте количество ячеек, пока не будет достигнут требуемый уровень потребления памяти.
Не используйте ClickHouse в качестве источника, так как он медленно обрабатывает запросы со случайным чтением.
complex_key_cache
Этот тип хранилища предназначен для работы с составными ключами. Аналогичен cache.
ssd_cache
Аналогичен cache, но хранит данные на SSD, а индекс — в RAM. Все настройки словарей типа cache, связанные с очередью обновления, также могут применяться к словарям SSD cache.
Ключ словаря имеет тип UInt64.
или
complex_key_ssd_cache
Этот тип хранилища предназначен для составных ключей. Аналогичен ssd_cache.
direct
Словарь не хранится в памяти, и при обработке запроса данные запрашиваются непосредственно из источника.
Ключ словаря имеет тип UInt64.
Поддерживаются все типы источников, кроме локальных файлов.
Пример конфигурации:
или
complex_key_direct
Этот тип хранилища предназначен для использования с составными ключами. Аналогичен direct.
ip_trie
Этот словарь предназначен для поиска IP-адресов по сетевому префиксу. Он хранит IP-диапазоны в нотации CIDR и позволяет быстро определить, к какому префиксу (например, подсети или диапазону ASN) относится заданный IP, что делает его идеальным для поисковых операций по IP, таких как геолокация или классификация сетей.
Пример
Предположим, у нас есть таблица в ClickHouse, которая содержит наши IP-префиксы и соответствующие им соответствия:
Давайте определим словарь ip_trie для этой таблицы. Структура ip_trie требует составного ключа:
или
Ключ должен иметь только один атрибут типа String, который содержит разрешённый IP-префикс. Другие типы пока не поддерживаются.
Синтаксис выглядит следующим образом:
Функция принимает в качестве аргумента либо UInt32 для IPv4, либо FixedString(16) для IPv6. Например:
Другие типы пока не поддерживаются. Функция возвращает атрибут для префикса, который соответствует этому IP-адресу. Если есть перекрывающиеся префиксы, возвращается наиболее специфичный.
Данные должны полностью помещаться в оперативную память.
Обновление данных словарей с помощью LIFETIME
ClickHouse периодически обновляет словари на основе тега LIFETIME (задается в секундах). LIFETIME — это интервал обновления для полностью загружаемых словарей и интервал инвалидации для кэшируемых словарей.
Во время обновления старая версия словаря может по-прежнему использоваться в запросах. Обновление словарей (кроме первоначальной загрузки словаря) не блокирует выполнение запросов. Если во время обновления происходит ошибка, она записывается в лог сервера, а запросы продолжают выполняться со старой версией словаря. Если обновление словаря завершилось успешно, старая версия словаря атомарно заменяется новой.
Пример настроек:
Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.
или
Установка значения <lifetime>0</lifetime> (LIFETIME(0)) предотвращает обновление словарей.
Вы можете задать интервал времени для обновлений, и ClickHouse выберет равномерно случайный момент времени внутри этого диапазона. Это необходимо для распределения нагрузки на источник словаря при обновлении на большом количестве серверов.
Пример настроек:
или
Если <min>0</min> и <max>0</max>, ClickHouse не перезагружает словарь по истечении таймаута.
В этом случае ClickHouse может перезагрузить словарь раньше, если был изменён конфигурационный файл словаря или выполнена команда SYSTEM RELOAD DICTIONARY.
При обновлении словарей сервер ClickHouse применяет разную логику в зависимости от типа источника:
- Для текстового файла проверяется время модификации. Если оно отличается от ранее зафиксированного, словарь обновляется.
- Словари из других источников по умолчанию обновляются каждый раз.
Для других источников (ODBC, PostgreSQL, ClickHouse и т. д.) можно настроить запрос, который будет обновлять словари только в том случае, если они действительно изменились, а не каждый раз. Для этого выполните следующие шаги:
- Таблица словаря должна содержать поле, которое всегда изменяется при обновлении исходных данных.
- В настройках источника должен быть указан запрос, который извлекает это изменяющееся поле. Сервер ClickHouse интерпретирует результат запроса как одну строку, и если эта строка изменилась по сравнению с предыдущим состоянием, словарь обновляется. Укажите запрос в поле
<invalidate_query>в настройках для источника.
Пример настроек:
или
Для словарей Cache, ComplexKeyCache, SSDCache и SSDComplexKeyCache поддерживаются как синхронные, так и асинхронные обновления.
Также для словарей Flat, Hashed, HashedArray, ComplexKeyHashed можно запрашивать только те данные, которые были изменены после предыдущего обновления. Если update_field указан как часть конфигурации источника словаря, к запросу данных будет добавлено значение времени предыдущего обновления в секундах. В зависимости от типа источника (Executable, HTTP, MySQL, PostgreSQL, ClickHouse или ODBC) к update_field будет применяться различная логика перед запросом данных из внешнего источника.
- Если источником является HTTP, то
update_fieldбудет добавлен как параметр запроса со временем последнего обновления в качестве значения. - Если источником является Executable, то
update_fieldбудет добавлен как аргумент исполняемого файла со временем последнего обновления в качестве значения аргумента. - Если источником является ClickHouse, MySQL, PostgreSQL или ODBC, будет добавлена дополнительная часть
WHERE, гдеupdate_fieldсравнивается как больше или равно времени последнего обновления.- По умолчанию это условие
WHEREпроверяется на самом верхнем уровне SQL‑запроса. При необходимости это условие можно проверить в любом другом выраженииWHEREвнутри запроса с использованием ключевого слова{condition}. Пример:
- По умолчанию это условие
Если опция update_field задана, можно задать дополнительную опцию update_lag. Значение опции update_lag вычитается из предыдущего времени обновления перед запросом обновлённых данных.
Пример настроек:
или
Источники словарей
Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.
Словарь можно подключать к ClickHouse из самых разных источников.
Если словарь настроен с использованием XML-файла, конфигурация выглядит так:
В случае использования DDL-запроса описанная выше конфигурация будет выглядеть следующим образом:
Источник конфигурируется в разделе source.
Для следующих типов источников: Local file, Executable file, HTTP(s), ClickHouse доступны дополнительные параметры:
или
Типы источников (source_type):
Локальный файл
Пример настроек:
или
Настройки полей:
path– абсолютный путь к файлу.format– формат файла. Поддерживаются все форматы, описанные в Форматы.
Когда словарь с источником FILE создаётся с помощью DDL-команды (CREATE DICTIONARY ...), файл-источник должен находиться в каталоге user_files, чтобы предотвратить доступ пользователей БД к произвольным файлам на узле ClickHouse.
См. также
Исполняемый файл
Работа с исполняемыми файлами зависит от того, как словарь хранится в памяти. Если словарь хранится с использованием cache и complex_key_cache, ClickHouse запрашивает необходимые ключи, отправляя запрос на STDIN исполняемого файла. В противном случае ClickHouse запускает исполняемый файл и интерпретирует его вывод как данные словаря.
Пример настроек:
Задание полей:
command— абсолютный путь к исполняемому файлу или имя файла (если каталог с командой находится вPATH).format— формат файла. Поддерживаются все форматы, описанные в разделе Formats.command_termination_timeout— исполняемый скрипт должен содержать основной цикл чтения и записи. После уничтожения словаря канал (pipe) закрывается, и у исполняемого файла будетcommand_termination_timeoutсекунд на завершение работы, прежде чем ClickHouse отправит дочернему процессу сигнал SIGTERM.command_termination_timeoutзадаётся в секундах. Значение по умолчанию — 10. Необязательный параметр.command_read_timeout— таймаут чтения данных из stdout команды в миллисекундах. Значение по умолчанию — 10000. Необязательный параметр.command_write_timeout— таймаут записи данных в stdin команды в миллисекундах. Значение по умолчанию — 10000. Необязательный параметр.implicit_key— исполняемый источник может возвращать только значения, а соответствие запрошенным ключам определяется неявно — по порядку строк в результате. Значение по умолчанию — false.execute_direct— еслиexecute_direct=1, тоcommandбудет искаться в каталогеuser_scripts, указанном в user_scripts_path. Дополнительные аргументы скрипта можно указать, разделяя их пробелами. Пример:script_name arg1 arg2. Еслиexecute_direct=0,commandпередаётся как аргумент дляbin/sh -c. Значение по умолчанию —0. Необязательный параметр.send_chunk_header— определяет, нужно ли отправлять количество строк перед отправкой блока данных на обработку. Необязательный параметр. Значение по умолчанию —false.
Этот источник словаря может быть сконфигурирован только через XML-конфигурацию. Создание словарей с исполняемым источником через DDL отключено; в противном случае пользователь БД смог бы выполнять произвольные бинарные файлы на узле ClickHouse.
Executable Pool
Executable pool позволяет загружать данные из пула процессов. Этот источник не работает со схемами размещения словарей, которым требуется загрузить все данные из источника. Executable pool работает, если словарь хранится с использованием схем размещения cache, complex_key_cache, ssd_cache, complex_key_ssd_cache, direct или complex_key_direct.
Executable pool создаёт пул процессов с указанной командой и поддерживает их работу до их завершения. Программа должна читать данные из STDIN, пока они доступны, и выводить результат в STDOUT. Она может ожидать следующий блок данных на STDIN. ClickHouse не будет закрывать STDIN после обработки блока данных, а при необходимости передаст по нему следующий блок данных. Исполняемый скрипт должен быть готов к такому способу обработки данных — он должен опрашивать STDIN и как можно раньше сбрасывать данные в STDOUT.
Пример настроек:
Настройка полей:
command— Абсолютный путь к исполняемому файлу или имя файла (если каталог программы прописан вPATH).format— Формат файла. Поддерживаются все форматы, описанные в разделе «Formats».pool_size— Размер пула. Если дляpool_sizeуказано значение0, ограничения на размер пула отсутствуют. Значение по умолчанию —16.command_termination_timeout— Исполняемый скрипт должен содержать основной цикл чтения и записи. После уничтожения словаря канал (pipe) закрывается, и у исполняемого файла будетcommand_termination_timeoutсекунд на завершение работы, прежде чем ClickHouse отправит сигнал SIGTERM дочернему процессу. Задаётся в секундах. Значение по умолчанию —10. Необязательный параметр.max_command_execution_time— Максимальное время выполнения команды исполняемого скрипта при обработке блока данных. Задаётся в секундах. Значение по умолчанию —10. Необязательный параметр.command_read_timeout— таймаут чтения данных из stdout команды в миллисекундах. Значение по умолчанию —10000. Необязательный параметр.command_write_timeout— таймаут записи данных в stdin команды в миллисекундах. Значение по умолчанию —10000. Необязательный параметр.implicit_key— Исполняемый источник может возвращать только значения, а соответствие запрошенным ключам определяется неявно — по порядку строк в результате. Значение по умолчанию —false. Необязательный параметр.execute_direct— Еслиexecute_direct=1, тоcommandбудет искаться в каталогеuser_scripts, указанном в user_scripts_path. Дополнительные аргументы скрипта можно указать, разделяя их пробелами. Пример:script_name arg1 arg2. Еслиexecute_direct=0,commandпередаётся как аргумент дляbin/sh -c. Значение по умолчанию —1. Необязательный параметр.send_chunk_header— управляет тем, нужно ли отправлять количество строк перед отправкой фрагмента данных на обработку. Необязательный параметр. Значение по умолчанию —false.
Этот источник словаря может быть настроен только через XML-конфигурацию. Создание словарей с исполняемым источником через DDL отключено, иначе пользователь БД получил бы возможность выполнять произвольные бинарные файлы на узле ClickHouse.
HTTP(S)
Работа с HTTP(S)-сервером зависит от того, как словарь хранится в памяти. Если словарь хранится с использованием cache и complex_key_cache, ClickHouse запрашивает необходимые ключи, отправляя запрос методом POST.
Пример настроек:
или
Чтобы ClickHouse мог получить доступ к HTTPS-ресурсу, необходимо настроить OpenSSL в конфигурации сервера.
Поля настроек:
url– URL источника.format– Формат файла. Поддерживаются все форматы, описанные в разделе «Formats».credentials– HTTP-аутентификация по схеме Basic. Необязательный параметр.user– Имя пользователя, необходимое для аутентификации.password– Пароль, необходимый для аутентификации.headers– Все пользовательские HTTP-заголовки, используемые в HTTP-запросе. Необязательный параметр.header– Отдельный HTTP-заголовок.name– Имя идентификатора, используемого для заголовка, отправляемого в запросе.value– Значение, устанавливаемое для конкретного идентификатора.
При создании словаря с помощью DDL-команды (CREATE DICTIONARY ...) удалённые хосты для HTTP-словарей проверяются по содержимому секции remote_url_allow_hosts в конфигурации, чтобы предотвратить доступ пользователей базы данных к произвольным HTTP-серверам.
DBMS
ODBC
Вы можете использовать этот метод для подключения любой базы данных, для которой существует ODBC-драйвер.
Пример настроек:
или
Настройка полей:
db– Имя базы данных. Опустите его, если имя базы данных задано в параметрах<connection_string>.table– Имя таблицы и схемы, если она используется.connection_string– Строка подключения.invalidate_query– Запрос для проверки статуса словаря. Необязательный параметр. Подробнее см. в разделе Обновление данных словаря с помощью LIFETIME.background_reconnect– Переподключаться к реплике в фоновом режиме при сбое соединения. Необязательный параметр.query– Пользовательский запрос. Необязательный параметр.
Поля table и query не могут использоваться одновременно. При этом одно из полей table или query обязательно должно быть указано.
ClickHouse получает символы кавычек от ODBC-драйвера и заключает все настройки в запросах к драйверу в кавычки, поэтому необходимо указывать имя таблицы в соответствии с регистром имени таблицы в базе данных.
Если у вас возникают проблемы с кодировками при использовании Oracle, см. соответствующий пункт FAQ.
Известная уязвимость функциональности ODBC-словаря
При подключении к базе данных через ODBC-драйвер параметр подключения Servername может быть подменён. В этом случае значения USERNAME и PASSWORD из odbc.ini отправляются на удалённый сервер и могут быть скомпрометированы.
Пример небезопасного использования
Настроим unixODBC для PostgreSQL. Содержимое /etc/odbc.ini:
Если затем вы выполните, например, такой запрос:
Драйвер ODBC отправит значения параметров USERNAME и PASSWORD из файла odbc.ini на сервер some-server.com.
Пример подключения PostgreSQL
Операционная система Ubuntu.
Установка unixODBC и ODBC-драйвера для PostgreSQL:
Настройка /etc/odbc.ini (или ~/.odbc.ini, если вы вошли в систему под пользователем, от имени которого запускается ClickHouse):
Конфигурация словаря в ClickHouse:
или
Вам может понадобиться отредактировать odbc.ini, чтобы указать полный путь к библиотеке драйвера: DRIVER=/usr/local/lib/psqlodbcw.so.
Пример подключения MS SQL Server
ОС Ubuntu.
Установка ODBC-драйвера для подключения к MS SQL Server:
Настройка драйвера:
Примечания:
- чтобы определить минимальную версию TDS, поддерживаемую конкретной версией SQL Server, обратитесь к документации по продукту или см. MS-TDS Product Behavior
Настройка словаря в ClickHouse:
или
MySQL
Пример конфигурации:
или
Описание полей настроек:
-
port– Порт сервера MySQL. Вы можете задать его для всех реплик сразу или для каждой реплики отдельно (внутри<replica>). -
user– Имя пользователя MySQL. Вы можете задать его для всех реплик сразу или для каждой реплики отдельно (внутри<replica>). -
password– Пароль пользователя MySQL. Вы можете задать его для всех реплик сразу или для каждой реплики отдельно (внутри<replica>). -
replica– Секция конфигурации реплик. Может быть несколько таких секций.replica/host– Хост MySQL.replica/priority– Приоритет реплики. При попытке подключения ClickHouse обходит реплики в порядке приоритета. Чем меньше число, тем выше приоритет.
-
db– Имя базы данных. -
table– Имя таблицы. -
where– Условия выборки. Синтаксис условий такой же, как в предложенииWHEREв MySQL, например,id > 10 AND id < 20. Необязательный параметр. -
invalidate_query– Запрос для проверки состояния словаря. Необязательный параметр. Подробнее см. в разделе Refreshing dictionary data using LIFETIME. -
fail_on_connection_loss– Параметр конфигурации, который управляет поведением сервера при потере соединения. Еслиtrue, исключение генерируется немедленно при потере соединения между клиентом и сервером. Еслиfalse, сервер ClickHouse делает три попытки выполнить запрос, прежде чем сгенерировать исключение. Имейте в виду, что повторные попытки приводят к увеличению времени ответа. Значение по умолчанию:false. -
query– Пользовательский запрос. Необязательный параметр.
Поля table и where не могут использоваться совместно с полем query. При этом одно из полей table или query должно быть объявлено.
Явного параметра secure не существует. При установке SSL-соединения оно всегда должно быть защищённым.
К MySQL можно подключаться на локальном хосте через сокеты. Для этого задайте host и socket.
Пример настроек:
или
ClickHouse
Пример конфигурации:
или
Настройка полей:
host– Хост ClickHouse. Если это локальный хост, запрос обрабатывается без какой-либо сетевой активности. Для повышения отказоустойчивости вы можете создать таблицу Distributed и указать её в последующих конфигурациях.port– Порт на сервере ClickHouse.user– Имя пользователя ClickHouse.password– Пароль пользователя ClickHouse.db– Имя базы данных.table– Имя таблицы.where– Критерий выборки. Поле необязательное.invalidate_query– Запрос для проверки состояния словаря. Необязательный параметр. Подробнее см. раздел Refreshing dictionary data using LIFETIME.secure– Использовать SSL для подключения.query– Пользовательский запрос. Необязательный параметр.
Поля table или where не могут использоваться совместно с полем query. При этом должно быть объявлено одно из полей table или query.
MongoDB
Пример настроек:
или
или
Поля настройки:
host– Хост MongoDB.port– Порт сервера MongoDB.user– Имя пользователя MongoDB.password– Пароль пользователя MongoDB.db– Имя базы данных.collection– Имя коллекции.options– Параметры строки подключения MongoDB (необязательный параметр).
или
Поля настроек:
uri— URI для подключения.collection— имя коллекции.
Redis
Пример настроек:
или
Поля настроек:
host– Хост Redis.port– Порт сервера Redis.storage_type– Структура внутреннего хранилища Redis, используемая для работы с ключами.simple— для простых источников и для хешированных источников с одним ключом,hash_map— для хешированных источников с двумя ключами. Источники диапазонов и источники кэша со сложным ключом не поддерживаются. Параметр может быть опущен, значение по умолчанию —simple.db_index– Числовой индекс логической базы данных Redis. Параметр может быть опущен, значение по умолчанию — 0.
Cassandra
Пример настроек:
Поля настроек:
host– хост Cassandra или список хостов, разделённых запятыми.port– порт серверов Cassandra. Если не указан, используется порт по умолчанию 9042.user– имя пользователя Cassandra.password– пароль пользователя Cassandra.keyspace– имя keyspace (базы данных).column_family– имя column family (таблицы).allow_filtering– флаг, разрешающий или запрещающий потенциально дорогостоящие условия по столбцам clustering key. Значение по умолчанию — 1.partition_key_prefix– количество столбцов partition key в первичном ключе таблицы Cassandra. Обязателен для словарей с составным ключом. Порядок ключевых столбцов в определении словаря должен совпадать с порядком в Cassandra. Значение по умолчанию — 1 (первый столбец ключа — partition key, остальные столбцы ключа — clustering key).consistency– уровень согласованности. Допустимые значения:One,Two,Three,All,EachQuorum,Quorum,LocalQuorum,LocalOne,Serial,LocalSerial. Значение по умолчанию —One.where– необязательные условия отбора.max_threads– максимальное количество потоков, используемых для загрузки данных из нескольких партиций в словарях с составным ключом.query– пользовательский запрос. Необязательный параметр.
Поля column_family или where нельзя использовать совместно с полем query. При этом должно быть объявлено одно из полей column_family или query.
PostgreSQL
Пример настроек:
или
Поля настройки:
host– Хост на сервере PostgreSQL. Вы можете указать его для всех реплик или для каждой отдельно (внутри<replica>).port– Порт на сервере PostgreSQL. Вы можете указать его для всех реплик или для каждой отдельно (внутри<replica>).user– Имя пользователя PostgreSQL. Вы можете указать его для всех реплик или для каждой отдельно (внутри<replica>).password– Пароль пользователя PostgreSQL. Вы можете указать его для всех реплик или для каждой отдельно (внутри<replica>).replica– Секция с конфигурацией реплик. Может быть несколько секций:replica/host– Хост PostgreSQL.replica/port– Порт PostgreSQL.replica/priority– Приоритет реплики. При попытке подключиться ClickHouse обходит реплики в порядке приоритета. Чем меньше число, тем выше приоритет.
db– Имя базы данных.table– Имя таблицы.where– Критерии отбора. Синтаксис условий такой же, как в оператореWHEREв PostgreSQL. Например,id > 10 AND id < 20. Необязательный параметр.invalidate_query– Запрос для проверки состояния словаря. Необязательный параметр. Подробнее см. в разделе Refreshing dictionary data using LIFETIME.background_reconnect– Переподключение к реплике в фоновом режиме при сбое подключения. Необязательный параметр.query– Пользовательский запрос. Необязательный параметр.
Поля table или where нельзя использовать вместе с полем query. При этом одно из полей table или query должно быть объявлено.
Null
Специальный источник, который можно использовать для создания фиктивных (пустых) словарей. Такие словари могут быть полезны для тестов или в конфигурациях с раздельными узлами данных и запросов на узлах, где размещены таблицы типа Distributed.
Ключ и поля словаря
Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.
Секция structure описывает ключ словаря и поля, доступные для запросов.
XML-описание:
Атрибуты задаются элементами:
<id>— ключевой столбец<attribute>— столбец данных; таких атрибутов может быть несколько.
DDL-запрос:
Атрибуты задаются в теле запроса:
PRIMARY KEY— ключевой столбецAttrName AttrType— столбец с данными. Таких атрибутов может быть несколько.
Ключ
ClickHouse поддерживает следующие типы ключей:
- Числовой ключ.
UInt64. Определяется в теге<id>или с помощью ключевого словаPRIMARY KEY. - Составной ключ. Набор значений разных типов. Определяется в теге
<key>или с помощью ключевого словаPRIMARY KEY.
XML-структура может содержать либо <id>, либо <key>. DDL-запрос должен содержать только один PRIMARY KEY.
Нельзя описывать ключ как атрибут.
Числовой ключ
Тип: UInt64.
Пример конфигурации:
Поля конфигурации:
name– имя столбца с ключами.
Для DDL-запроса:
PRIMARY KEY– Имя столбца, содержащего ключи.
Составной ключ
Ключ может быть кортежем (tuple) из полей любых типов. В этом случае layout должен быть complex_key_hashed или complex_key_cache.
Составной ключ может состоять из единственного элемента. Это, например, позволяет использовать строку в качестве ключа.
Структура ключа задаётся в элементе <key>. Поля ключа указываются в том же формате, что и атрибуты словаря. Пример:
или
В запросе к функции dictGet* в качестве ключа используется кортеж. Пример: dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2)).
Атрибуты
Пример конфигурации:
или
Поля конфигурации:
| Tag | Description | Required |
|---|---|---|
name | Имя столбца. | Да |
type | Тип данных ClickHouse: UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64, UUID, Decimal32, Decimal64, Decimal128, Decimal256,Date, Date32, DateTime, DateTime64, String, Array. ClickHouse пытается привести значение из словаря к указанному типу данных. Например, для MySQL поле в исходной таблице MySQL может иметь тип TEXT, VARCHAR или BLOB, но в ClickHouse оно может быть загружено как String.Nullable в настоящее время поддерживается для словарей Flat, Hashed, ComplexKeyHashed, Direct, ComplexKeyDirect, RangeHashed, Polygon, Cache, ComplexKeyCache, SSDCache, SSDComplexKeyCache. В словарях IPTrie типы Nullable не поддерживаются. | Да |
null_value | Значение по умолчанию для несуществующего элемента. В примере это пустая строка. Значение NULL можно использовать только для типов Nullable (см. предыдущую строку с описанием типов). | Да |
expression | Выражение, которое ClickHouse выполняет над значением. Выражением может быть имя столбца в удалённой SQL базе данных. Таким образом, вы можете использовать его для создания псевдонима для удалённого столбца. Значение по умолчанию: выражение отсутствует. | Нет |
hierarchical | Если true, атрибут содержит значение родительского ключа для текущего ключа. См. Иерархические словари.Значение по умолчанию: false. | Нет |
injective | Флаг, который показывает, является ли отображение id -> attribute инъективным.Если true, ClickHouse может автоматически выполнять запросы к инъективным словарям после предложения GROUP BY. Обычно это существенно сокращает количество таких запросов.Значение по умолчанию: false. | Нет |
is_object_id | Флаг, который показывает, выполняется ли запрос для документа MongoDB по ObjectID.Значение по умолчанию: false. | Нет |
Иерархические словари
ClickHouse поддерживает иерархические словари с числовым ключом.
Рассмотрим следующую иерархическую структуру:
Эту иерархию можно представить в виде следующей словарной таблицы.
| region_id | parent_region | region_name |
|---|---|---|
| 1 | 0 | Россия |
| 2 | 1 | Москва |
| 3 | 2 | Центр |
| 4 | 0 | Великобритания |
| 5 | 4 | Лондон |
Эта таблица содержит столбец parent_region, в котором хранится ключ ближайшего родительского элемента.
ClickHouse поддерживает иерархическое свойство для атрибутов внешних словарей. Это свойство позволяет настроить иерархический словарь, подобный описанному выше.
Функция dictGetHierarchy позволяет получить цепочку родительских элементов.
В нашем примере структура словаря может быть следующей:
Словари полигонов
Этот словарь оптимизирован для запросов «точка в полигоне», по сути — для задач обратного геокодирования. По заданной координате (широта/долгота) он эффективно определяет, какой полигон или регион (из множества полигонов, например границ стран или регионов) содержит эту точку. Хорошо подходит для сопоставления координат местоположения с регионом, которому они принадлежат.
Пример конфигурации словаря полигонов:
Если вы используете словари с ClickHouse Cloud, используйте DDL-запрос для их создания и создавайте словари от имени пользователя default.
Также проверьте список поддерживаемых источников словарей в руководстве по совместимости с ClickHouse Cloud.
Соответствующий DDL-запрос:
При настройке словаря полигонов ключ должен иметь один из двух типов:
- Простой полигон. Это массив точек.
- MultiPolygon. Это массив полигонов. Каждый полигон — это двумерный массив точек. Первый элемент этого массива — внешняя граница полигона, а последующие элементы задают области, которые следует из него исключить.
Точки могут быть заданы в виде массива или кортежа координат. В текущей реализации поддерживаются только двумерные точки.
Пользователь может загружать собственные данные во всех форматах, поддерживаемых ClickHouse.
Доступны 3 типа хранения в памяти:
-
POLYGON_SIMPLE. Это наивная реализация, при которой для каждого запроса выполняется линейный проход по всем полигонам и для каждого из них проверяется принадлежность точки полигону без использования дополнительных индексов. -
POLYGON_INDEX_EACH. Для каждого полигона строится отдельный индекс, что позволяет в большинстве случаев быстро проверять принадлежность (оптимизировано для географических регионов). Также на рассматриваемую область накладывается сетка, что существенно сужает число полигонов, подлежащих рассмотрению. Сетка создаётся рекурсивным делением ячейки на 16 равных частей и настраивается двумя параметрами. Деление останавливается, когда глубина рекурсии достигаетMAX_DEPTHили когда ячейка пересекает не болееMIN_INTERSECTIONSполигонов. Для обработки запроса определяется соответствующая ячейка, и поочерёдно осуществляется доступ к индексу для полигонов, хранящихся в ней. -
POLYGON_INDEX_CELL. При таком размещении также создаётся описанная выше сетка. Доступны те же параметры настройки. Для каждой листовой ячейки сетки строится индекс по всем фрагментам полигонов, которые в неё попадают, что позволяет быстро отвечать на запрос. -
POLYGON. Синоним дляPOLYGON_INDEX_CELL.
Запросы к словарю выполняются с помощью стандартных функций для работы со словарями. Важное отличие состоит в том, что здесь ключами будут точки, для которых нужно найти полигон, который их содержит.
Пример
Пример работы со словарём, определённым выше:
В результате выполнения последнего запроса для каждой точки в таблице points будет найден полигон минимальной площади, содержащий эту точку, и будут выведены запрошенные атрибуты.
Пример
Вы можете читать столбцы из словарей полигонов с помощью запроса SELECT — просто включите store_polygon_key_column = 1 в конфигурации словаря или в соответствующем DDL-запросе.
Запрос:
Результат:
Словарь на основе дерева регулярных выражений
Этот словарь позволяет сопоставлять ключи значениям на основе иерархических шаблонов регулярных выражений. Он оптимизирован для поиска по сопоставлению шаблонов (например, классификации строк, таких как строки User-Agent, путём сопоставления с шаблонами регулярных выражений), а не для точного соответствия ключей.
Использование словаря на основе дерева регулярных выражений в ClickHouse с открытым исходным кодом
Словари на основе дерева регулярных выражений в ClickHouse с открытым исходным кодом определяются с использованием источника YAMLRegExpTree, которому передаётся путь к YAML-файлу, содержащему дерево регулярных выражений.
Источник словаря YAMLRegExpTree описывает структуру дерева регулярных выражений. Например:
Эта конфигурация состоит из списка узлов дерева регулярных выражений. Каждый узел имеет следующую структуру:
- regexp: регулярное выражение узла.
- attributes: список пользовательских атрибутов словаря. В этом примере есть два атрибута:
nameиversion. Первый узел определяет оба атрибута. Второй узел определяет только атрибутname. Атрибутversionзадаётся дочерними узлами второго узла.- Значение атрибута может содержать обратные ссылки, ссылающиеся на группы захвата сопоставленного регулярного выражения. В примере значение атрибута
versionв первом узле состоит из обратной ссылки\1на группу захвата(\d+[\.\d]*)в регулярном выражении. Номера обратных ссылок находятся в диапазоне от 1 до 9 и записываются как$1или\1(для номера 1). При выполнении запроса обратная ссылка заменяется соответствующей сопоставленной группой захвата.
- Значение атрибута может содержать обратные ссылки, ссылающиеся на группы захвата сопоставленного регулярного выражения. В примере значение атрибута
- child nodes: список дочерних узлов узла дерева регулярных выражений, каждый из которых имеет свои атрибуты и (потенциально) дочерние узлы. Сопоставление строк выполняется в порядке обхода в глубину. Если строка соответствует узлу регулярного выражения, словарь проверяет, соответствует ли она также дочерним узлам этого узла. Если это так, назначаются атрибуты самого глубокого соответствующего узла. Атрибуты дочернего узла переопределяют одноимённые атрибуты родительских узлов. Имена дочерних узлов в YAML-файлах могут быть произвольными, например,
versionsв приведённом выше примере.
Словари в виде дерева регулярных выражений допускают доступ только с использованием функций dictGet, dictGetOrDefault и dictGetAll.
Пример:
Результат:
В этом случае мы сначала сопоставляем регулярное выражение \d+/tclwebkit(?:\d+[\.\d]*) со вторым узлом верхнего уровня. Затем словарь переходит к дочерним узлам и обнаруживает, что строка также соответствует 3[12]/tclwebkit. В результате значение атрибута name равно Android (заданному на первом уровне), а значение атрибута version равно 12 (заданному в дочернем узле).
С помощью мощного конфигурационного файла YAML мы можем использовать словари в виде дерева регулярных выражений в качестве парсера строки User-Agent. Мы поддерживаем uap-core и демонстрируем, как использовать его в функциональном тесте 02504_regexp_dictionary_ua_parser
Сбор значений атрибутов
Иногда бывает полезно возвращать значения из нескольких совпавших регулярных выражений, а не только значение листового узла. В таких случаях можно использовать специализированную функцию dictGetAll. Если узел имеет значение атрибута типа T, dictGetAll вернёт Array(T), содержащий ноль или более значений.
По умолчанию количество совпадений, возвращаемых для одного ключа, не ограничено. Ограничение можно передать в качестве необязательного четвёртого аргумента функции dictGetAll. Массив заполняется в топологическом порядке, что означает, что дочерние узлы идут перед родительскими, а одноуровневые узлы следуют в порядке исходного определения.
Пример:
Результат:
Режимы сопоставления
Поведение сопоставления по шаблону можно изменить с помощью некоторых настроек словаря:
regexp_dict_flag_case_insensitive: использовать регистронезависимое сопоставление (по умолчаниюfalse). Можно переопределить в отдельных выражениях с помощью(?i)и(?-i).regexp_dict_flag_dotall: разрешить символу '.' сопоставляться с символами перевода строки (по умолчаниюfalse).
Использование словаря Regular Expression Tree в ClickHouse Cloud
Используемый выше источник YAMLRegExpTree работает в ClickHouse Open Source, но не в ClickHouse Cloud. Чтобы использовать словари regexp tree в ClickHouse Cloud, сначала создайте локально в ClickHouse Open Source словарь regexp tree из YAML-файла, затем выгрузите этот словарь в CSV-файл с помощью табличной функции dictionary и предложения INTO OUTFILE.
Содержимое CSV-файла:
Схема файла дампа:
id UInt64: идентификатор узла RegexpTree.parent_id UInt64: идентификатор родительского узла.regexp String: строка регулярного выражения.keys Array(String): имена пользовательских атрибутов.values Array(String): значения пользовательских атрибутов.
Чтобы создать словарь в ClickHouse Cloud, сначала создайте таблицу regexp_dictionary_source_table со следующей структурой:
Затем обновите локальный CSV командой
Подробности см. в разделе Insert Local Files. После инициализации исходной таблицы мы можем создать RegexpTree по её источнику:
Встроенные словари
Эта страница не относится к ClickHouse Cloud. Описанная здесь функция недоступна в услугах ClickHouse Cloud. См. руководство ClickHouse Совместимость с ClickHouse Cloud для получения дополнительной информации.
В ClickHouse есть встроенная функциональность для работы с геобазой.
Это позволяет:
- По ID региона получать его название на нужном языке.
- По ID региона получать ID города, области, федерального округа, страны или континента.
- Проверять, входит ли один регион в состав другого региона.
- Получать цепочку родительских регионов.
Все функции поддерживают «транслокальность» — возможность одновременно использовать различные представления принадлежности регионов. Подробнее см. раздел «Функции для работы со словарями веб-аналитики».
Внутренние словари отключены в стандартном пакете.
Чтобы включить их, раскомментируйте параметры path_to_regions_hierarchy_file и path_to_regions_names_files в конфигурационном файле сервера.
Геобаза загружается из текстовых файлов.
Поместите файлы regions_hierarchy*.txt в директорию path_to_regions_hierarchy_file. Этот параметр конфигурации должен содержать путь к файлу regions_hierarchy.txt (иерархия регионов по умолчанию), а остальные файлы (regions_hierarchy_ua.txt) должны находиться в той же директории.
Поместите файлы regions_names_*.txt в директорию path_to_regions_names_files.
Вы также можете создать эти файлы самостоятельно. Формат файлов следующий:
regions_hierarchy*.txt: TabSeparated (без заголовка), столбцы:
- ID региона (
UInt32) - ID родительского региона (
UInt32) - тип региона (
UInt8): 1 — континент, 3 — страна, 4 — федеральный округ, 5 — регион, 6 — город; другие типы не имеют значений - население (
UInt32) — необязательный столбец
regions_names_*.txt: TabSeparated (без заголовка), столбцы:
- ID региона (
UInt32) - название региона (
String) — не может содержать символы табуляции и переводы строки, даже в экранированном виде.
Для хранения в ОЗУ используется плоский массив. По этой причине ID не должны превышать одного миллиона.
Словари можно обновлять без перезапуска сервера. Однако набор доступных словарей при этом не меняется.
Для обновления проверяются времена модификации файлов. Если файл изменился, соответствующий словарь обновляется.
Интервал проверки изменений настраивается параметром builtin_dictionaries_reload_interval.
Обновление словарей (кроме первоначальной загрузки при первом использовании) не блокирует запросы. Во время обновления запросы используют старые версии словарей. Если при обновлении возникает ошибка, она записывается в лог сервера, а запросы продолжают работать со старыми версиями словарей.
Мы рекомендуем периодически обновлять словари с геобазой. В ходе обновления генерируйте новые файлы и записывайте их в отдельное место. Когда все будет готово, переименуйте их в файлы, которые использует сервер.
Также существуют функции для работы с идентификаторами ОС и поисковых систем, но их не следует использовать.