Функции для работы со словарями
Для словарей, создаваемых с помощью DDL‑запросов, параметр dict_name должен быть полностью указан в формате <database>.<dict_name>. В противном случае используется текущая база данных.
Информацию о подключении и настройке словарей см. в разделе Словари.
dictGet, dictGetOrDefault, dictGetOrNull
Извлекает значения из словаря.
Аргументы
dict_name— имя словаря. Строковый литерал.attr_names— имя столбца словаря, строковый литерал, или кортеж имён столбцов — Tuple(строковый литерал).id_expr— значение ключа. Выражение, возвращающее значение типа ключа словаря или значение типа Tuple в зависимости от конфигурации словаря.default_value_expr— значения, возвращаемые, если в словаре нет строки с ключомid_expr. Expression или Tuple(Expression), возвращающее значение (или значения) в типах данных, настроенных для атрибутаattr_names.
Возвращаемое значение
-
Если ClickHouse успешно приводит атрибут к типу данных атрибута, функции возвращают значение атрибута словаря, соответствующее
id_expr. -
Если в словаре отсутствует ключ, соответствующий
id_expr, то:dictGetвозвращает содержимое элемента<null_value>, указанного для атрибута в конфигурации словаря.dictGetOrDefaultвозвращает значение, переданное в параметреdefault_value_expr.dictGetOrNullвозвращаетNULL, если ключ не найден в словаре.
ClickHouse выдает исключение, если не может распарсить значение атрибута или значение не соответствует типу данных атрибута.
Пример словаря с простым ключом
Создайте текстовый файл ext-dict-test.csv со следующим содержимым:
Первый столбец — id, второй столбец — c1.
Настройте словарь:
Выполните запрос:
Пример словаря со сложным ключом
Создайте текстовый файл ext-dict-mult.csv со следующим содержимым:
Первый столбец — id, второй — c1, третий — c2.
Настройте словарь:
Выполните запрос:
Пример словаря с диапазонным ключом
Входная таблица:
Создайте словарь:
Выполните запрос:
Результат:
См. также
dictHas
Проверяет, присутствует ли ключ в словаре.
Аргументы
dict_name— имя словаря. Строковый литерал.id_expr— значение ключа. Выражение, возвращающее значение типа ключа словаря или значение типа Tuple в зависимости от конфигурации словаря.
Возвращаемое значение
dictGetHierarchy
Создаёт массив, содержащий всех родителей заданного ключа в иерархическом словаре.
Синтаксис
Аргументы
dict_name— Имя словаря. Строковый литерал.key— Значение ключа. Выражение, возвращающее значение типа UInt64.
Возвращаемое значение
- Родительские элементы для ключа. Array(UInt64).
dictIsIn
Проверяет наличие предка ключа во всей иерархической цепочке словаря.
Аргументы
dict_name— имя словаря. Строковый литерал.child_id_expr— ключ, который требуется проверить. Выражение, возвращающее значение типа UInt64.ancestor_id_expr— предполагаемый предок ключаchild_id_expr. Выражение, возвращающее значение типа UInt64.
Возвращаемое значение
- 0, если
child_id_exprне является потомкомancestor_id_expr. UInt8. - 1, если
child_id_exprявляется потомкомancestor_id_exprили еслиchild_id_exprравенancestor_id_expr. UInt8.
dictGetChildren
Возвращает дочерние элементы первого уровня в виде массива индексов. Является обратной операцией к dictGetHierarchy.
Синтаксис
Аргументы
dict_name— имя словаря. Строковый литерал.key— значение ключа. Выражение, возвращающее значение типа UInt64.
Возвращаемые значения
Пример
Рассмотрим иерархический словарь:
Дочерние элементы первого уровня:
dictGetDescendant
Возвращает всех потомков так, как если бы функция dictGetChildren была рекурсивно применена level раз.
Синтаксис
Аргументы
dict_name— имя словаря. Строковый литерал.key— значение ключа. Выражение, возвращающее значение типа UInt64.level— уровень иерархии. Еслиlevel = 0, возвращает всех потомков до последнего уровня. UInt8.
Возвращаемые значения
Пример
Рассмотрим иерархический словарь:
Все потомки:
Потомки первого уровня:
dictGetAll
Извлекает значения атрибутов всех узлов, соответствующих каждому ключу в словаре на основе дерева регулярных выражений.
Помимо возврата значений типа Array(T) вместо T, эта функция ведёт себя аналогично dictGet.
Синтаксис
Аргументы
dict_name— имя словаря. Строковый литерал.attr_names— имя столбца словаря — строковый литерал — или кортеж имён столбцов — Tuple(строковый литерал).id_expr— значение ключа. Выражение, возвращающее массив значений типа ключа словаря или значение типа Tuple в зависимости от конфигурации словаря.limit— максимальная длина для каждого возвращаемого массива значений. При усечении дочерние узлы имеют приоритет над родительскими, а в остальных случаях соблюдается определённый порядок списка для словаря regexp tree. Если параметр не указан, длина массива не ограничена.
Возвращаемое значение
-
Если ClickHouse успешно интерпретирует значение атрибута в его тип данных, определённый в словаре, возвращается массив значений атрибутов словаря, которые соответствуют
id_exprдля каждого атрибута, указанного вattr_names. -
Если в словаре нет ключа, соответствующего
id_expr, возвращается пустой массив.
ClickHouse выбрасывает исключение, если не может интерпретировать значение атрибута или значение не соответствует типу данных атрибута.
Пример
Рассмотрим следующий словарь regexp tree:
Получить все совпадающие значения:
Получите до двух совпадающих значений:
dictGetKeys
Возвращает ключ(и) словаря, значение указанного атрибута которых равно заданному значению. Является обратной функцией к dictGet по одному атрибуту.
Синтаксис
Аргументы
dict_name— имя словаря. Строковый литерал.attr_name— имя столбца атрибута словаря. Строковый литерал.value_expr— значение для сравнения с атрибутом. Выражение, которое может быть приведено к типу данных атрибута.
Возвращаемое значение
-
Для словарей с простым ключом: массив ключей, для которых значение атрибута равно
value_expr. Array(T), гдеT— тип данных ключа словаря. -
Для словарей с составным ключом: массив кортежей ключей, для которых значение атрибута равно
value_expr. Array(Tuple(T1, T2, ...)), где каждыйTupleсодержит столбцы ключа словаря в заданном порядке. -
Если в словаре нет атрибута, соответствующего
value_expr, возвращается пустой массив.
ClickHouse генерирует исключение, если не удаётся интерпретировать значение атрибута или привести его к типу данных атрибута.
Пример
Рассмотрим следующий словарь:
Теперь получим все идентификаторы с уровнем high:
Используйте параметр max_reverse_dictionary_lookup_cache_size_bytes, чтобы ограничить размер кеша обратного поиска для каждого запроса, используемого dictGetKeys. Кеш хранит сериализованные кортежи ключей для каждого значения атрибута, чтобы избежать повторного сканирования словаря в рамках одного и того же запроса. Кеш не сохраняется между запросами. Когда лимит достигается, записи вытесняются по принципу LRU. Это наиболее эффективно для больших словарей, когда входные данные имеют низкую кардинальность и рабочий набор помещается в кеш. Установите значение 0, чтобы отключить кеширование.
Кроме того, если уникальные значения столбца attr_name помещаются в кеш, то в большинстве случаев выполнение функции должно быть линейным по количеству входных строк плюс небольшое количество сканирований словаря.
Другие функции
ClickHouse поддерживает специализированные функции, которые преобразуют значения атрибутов словаря в определённый тип данных независимо от конфигурации словаря.
Функции:
dictGetInt8,dictGetInt16,dictGetInt32,dictGetInt64dictGetUInt8,dictGetUInt16,dictGetUInt32,dictGetUInt64dictGetFloat32,dictGetFloat64dictGetDatedictGetDateTimedictGetUUIDdictGetStringdictGetIPv4,dictGetIPv6
Все эти функции имеют модификацию OrDefault. Например, dictGetDateOrDefault.
Синтаксис:
Аргументы
dict_name— Имя словаря. Строковый литерал.attr_name— Имя столбца словаря. Строковый литерал.id_expr— Значение ключа. Выражение, возвращающее значение типа UInt64 или Tuple в зависимости от конфигурации словаря.default_value_expr— Значение, возвращаемое, если в словаре нет строки с ключомid_expr. Выражение, возвращающее значение в тип данных, настроенный для атрибутаattr_name.
Возвращаемое значение
-
Если ClickHouse успешно разбирает атрибут в тип данных атрибута, функции возвращают значение атрибута словаря, соответствующее
id_expr. -
Если запрошенный
id_exprотсутствует в словаре, то:dictGet[Type]возвращает содержимое элемента<null_value>, указанного для атрибута в конфигурации словаря.dictGet[Type]OrDefaultвозвращает значение, переданное в параметреdefault_value_expr.
ClickHouse генерирует исключение, если не может разобрать значение атрибута или если значение не соответствует типу данных атрибута.
Примеры словарей
Примеры в этом разделе используют следующие словари. Вы можете создать их в ClickHouse, чтобы выполнить примеры для функций, описанных ниже.
Пример словаря для функций dictGet<T> и dictGet<T>OrDefault
Пример словаря для dictGetAll
Создайте таблицу для хранения данных словаря regexp tree:
Вставьте данные в таблицу:
Создайте словарь regexp tree:
Пример словаря с диапазонным ключом
Создайте входную таблицу:
Вставьте данные во входную таблицу:
Создайте словарь:
Пример словаря со сложным ключом
Создайте исходную таблицу:
Вставьте данные в исходную таблицу:
Создайте словарь:
Пример иерархического словаря
Создайте исходную таблицу:
Вставьте данные в исходную таблицу:
Создайте словарь: