Skip to main content

Ключ и поля словаря

Секция <structure> описывает ключ словаря и поля, доступные для запросов.

Описание в формате XML:

<dictionary>
<structure>
<id>
<name>Id</name>
</id>

<attribute>
<!-- Attribute parameters -->
</attribute>

...

</structure>
</dictionary>

Атрибуты описываются элементами:

Создание словаря запросом:

CREATE DICTIONARY dict_name (
Id UInt64,
-- attributes
)
PRIMARY KEY Id
...

Атрибуты задаются в теле запроса:

Ключ

ClickHouse поддерживает следующие виды ключей:

  • Числовой ключ. UInt64. Описывается в теге <id> или ключевым словом PRIMARY KEY.
  • Составной ключ. Набор значений разного типа. Описывается в теге <key> или ключевым словом PRIMARY KEY.

Структура может содержать либо <id> либо <key>. DDL-запрос может содержать только PRIMARY KEY.

"Обратите внимание"
Ключ не надо дополнительно описывать в атрибутах.

Числовой ключ

Тип: UInt64.

Пример конфигурации:

<id>
<name>Id</name>
</id>

Поля конфигурации:

  • name — имя столбца с ключами.

Для DDL-запроса:

CREATE DICTIONARY (
Id UInt64,
...
)
PRIMARY KEY Id
...
  • PRIMARY KEY – имя столбца с ключами.

Составной ключ

Ключом может быть кортеж (tuple) из полей произвольных типов. В этом случае layout должен быть complex_key_hashed или complex_key_cache.

Составной ключ может состоять из одного элемента. Это даёт возможность использовать в качестве ключа, например, строку.
:::

Структура ключа задаётся в элементе <key>. Поля ключа задаются в том же формате, что и атрибуты словаря. Пример:

<structure>
<key>
<attribute>
<name>field1</name>
<type>String</type>
</attribute>
<attribute>
<name>field2</name>
<type>UInt32</type>
</attribute>
...
</key>
...

или

CREATE DICTIONARY (
field1 String,
field2 String
...
)
PRIMARY KEY field1, field2
...

При запросе в функции dictGet* в качестве ключа передаётся кортеж. Пример: dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2)).

Атрибуты

Пример конфигурации:

<structure>
...
<attribute>
<name>Name</name>
<type>ClickHouseDataType</type>
<null_value></null_value>
<expression>rand64()</expression>
<hierarchical>true</hierarchical>
<injective>true</injective>
<is_object_id>true</is_object_id>
</attribute>
</structure>

или

CREATE DICTIONARY somename (
Name ClickHouseDataType DEFAULT '' EXPRESSION rand64() HIERARCHICAL INJECTIVE IS_OBJECT_ID
)

Поля конфигурации:

ТегОписаниеОбязательный
nameИмя столбца.Да
typeТип данных ClickHouse: UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64, UUID, Decimal32, Decimal64, Decimal128, Decimal256, String, Array.
ClickHouse пытается привести значение из словаря к заданному типу данных. Например, в случае MySQL, в таблице-источнике поле может быть TEXT, VARCHAR, BLOB, но загружено может быть как 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.
Нет
is_object_idПризнак того, что запрос выполняется к документу MongoDB по ObjectID.

Значение по умолчанию: false.
Нет

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