A cláusula structure descreve a chave do dicionário e os campos disponíveis para consultas.
Descrição em XML:
<dictionary>
<structure>
<id>
<name>Id</name>
</id>
<attribute>
<!-- Parâmetros de atributo -->
</attribute>
...
</structure>
</dictionary>Os atributos são descritos nos elementos:
<id>— coluna-chave<attribute>— coluna de dados: pode haver vários atributos.
Consulta DDL:
CREATE DICTIONARY dict_name (
Id UInt64,
-- atributos
)
PRIMARY KEY Id
...Os atributos são descritos no corpo da consulta:
PRIMARY KEY— coluna-chaveAttrName AttrType— coluna de dados. Pode haver vários atributos.
Chave
O ClickHouse oferece suporte aos seguintes tipos de chaves:
- Chave numérica.
UInt64. Definida na tag<id>ou com a palavra-chavePRIMARY KEY. - Chave composta. Conjunto de valores de tipos diferentes. Definida na tag
<key>ou com a palavra-chavePRIMARY KEY.
Uma estrutura XML pode conter <id> ou <key>. A consulta DDL deve conter uma única PRIMARY KEY.
Chave numérica
Tipo: UInt64.
Exemplo de configuração:
<id>
<name>Id</name>
</id>Campos de configuração:
name– O nome da coluna que contém as chaves.
Para a consulta DDL:
CREATE DICTIONARY (
Id UInt64,
...
)
PRIMARY KEY Id
...PRIMARY KEY– O nome da coluna que contém as chaves.
Chave composta
A chave pode ser uma tuple formada por campos de qualquer tipo. O layout nesse caso deve ser complex_key_hashed ou complex_key_cache.
A estrutura da chave é definida no elemento <key>. Os campos da chave são especificados no mesmo formato dos atributos do dicionário. Exemplo:
<structure>
<key>
<attribute>
<name>field1</name>
<type>String</type>
</attribute>
<attribute>
<name>field2</name>
<type>UInt32</type>
</attribute>
...
</key>
...ou
CREATE DICTIONARY (
field1 String,
field2 UInt32
...
)
PRIMARY KEY field1, field2
...Para uma consulta à função dictGet*, uma tupla é usada como chave. Exemplo: dictGetString('dict_name', 'attr_name', tuple('string for field1', num_for_field2)).
Quando a chave composta consiste em um único atributo, o valor da chave pode ser passado diretamente, sem encapsulá-lo em tuple. Por exemplo, tanto dictGetString('dict_name', 'attr_name', 'key') quanto dictGetString('dict_name', 'attr_name', tuple('key')) são válidos.
Atributos
Exemplo de configuração:
<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>or
CREATE DICTIONARY somename (
Name ClickHouseDataType DEFAULT '' EXPRESSION rand64() HIERARCHICAL INJECTIVE IS_OBJECT_ID
)Campos de configuração:
| Tag | Descrição | Obrigatório |
|---|---|---|
name |
Nome da coluna. | Sim |
type |
Tipo de dado do ClickHouse: UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64, UUID, Decimal32, Decimal64, Decimal128, Decimal256,Date, Date32, DateTime, DateTime64, String, Array. O ClickHouse tenta converter o valor do dicionário para o tipo de dado especificado. Por exemplo, no MySQL, o campo pode ser TEXT, VARCHAR ou BLOB na tabela de origem do MySQL, mas pode ser carregado como String no ClickHouse.Atualmente, Nullable é compatível com os dicionários Flat, Hashed, ComplexKeyHashed, Direct, ComplexKeyDirect, RangeHashed, Polygon, Cache, ComplexKeyCache, SSDCache, SSDComplexKeyCache. Em dicionários IPTrie, tipos Nullable não são compatíveis. |
Sim |
null_value |
Valor padrão para um elemento inexistente. No exemplo, é uma string vazia. O valor NULL só pode ser usado com tipos Nullable (veja a linha anterior com a descrição dos tipos). |
Sim |
expression |
Expressão que o ClickHouse executa sobre o valor. A expressão pode ser um nome de coluna no banco de dados SQL remoto. Assim, você pode usá-la para criar um alias para a coluna remota. Valor padrão: nenhuma expressão. |
Não |
hierarchical |
Se true, o atributo contém o valor da chave pai da chave atual. Veja Hierarchical Dictionaries.Valor padrão: false. |
Não |
injective |
Flag que indica se o mapeamento id -> attribute é injetivo.Se true, o ClickHouse pode colocar automaticamente, após a cláusula GROUP BY, as consultas aos dicionários com injetividade. Em geral, isso reduz significativamente a quantidade dessas consultas.Valor padrão: false. |
Não |
is_object_id |
Flag que indica se a consulta é executada para um documento do MongoDB por ObjectID.Valor padrão: false. |