Клауза structure описывает ключ словаря и поля, доступные в запросах.
Описание XML:
<dictionary>
<structure>
<id>
<name>Id</name>
</id>
<attribute>
<!-- Параметры атрибута -->
</attribute>
...
</structure>
</dictionary>Атрибуты описываются в элементах:
<id>— ключевой столбец<attribute>— столбец данных: атрибутов может быть несколько.
DDL-запрос:
CREATE DICTIONARY dict_name (
Id UInt64,
-- атрибуты
)
PRIMARY KEY Id
...Атрибуты задаются в теле запроса:
PRIMARY KEY— ключевой столбецAttrName AttrType— столбец данных. Атрибутов может быть несколько.
Ключ
ClickHouse поддерживает следующие типы ключей:
- Числовой ключ.
UInt64. Задаётся в теге<id>или с помощью ключевого словаPRIMARY KEY. - Составной ключ. Набор значений разных типов. Задаётся в теге
<key>или с помощью ключевого словаPRIMARY KEY.
XML-структура может содержать либо <id>, либо <key>. DDL-запрос должен содержать только один PRIMARY KEY.
Числовой ключ
Тип: UInt64.
Пример конфигурации:
<id>
<name>Id</name>
</id>Поля конфигурации:
name– имя столбца с ключами.
Для DDL-запроса:
CREATE DICTIONARY (
Id UInt64,
...
)
PRIMARY KEY Id
...PRIMARY KEY– Имя столбца, содержащего ключи.
Составной ключ
Ключом может быть Tuple из полей любых типов. Структура в этом случае должна быть 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>
...or
CREATE DICTIONARY (
field1 String,
field2 UInt32
...
)
PRIMARY KEY field1, field2
...В запросе к функции dictGet* в качестве ключа передаётся Tuple. Пример: dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2)).
Когда составной ключ состоит из одного атрибута, значение ключа можно передать напрямую, без обёртки в tuple. Например, допустимы оба варианта: dictGetString('dict_name', 'attr_name', 'key') и dictGetString('dict_name', 'attr_name', tuple('key')).
Атрибуты
Пример конфигурации:
<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
)Поля конфигурации:
| Tag | Описание | Обязательно |
|---|---|---|
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 поле исходной таблицы может иметь тип 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. |