Tipos de datos
Numéricos
Float64 ofrece un
rango más amplio de valores, a costa de precisión.
En contraste, ClickHouse ofrece múltiples precisiones con signo y sin signo
para flotantes y enteros. Con ellas, puedes especificar de forma explícita
la precisión necesaria para los enteros a fin de optimizar el almacenamiento y el uso de memoria. Un
tipo Decimal, equivalente al tipo Number de Snowflake, también ofrece el doble de
precisión y escala, hasta 76 dígitos. Además de un valor Float64 similar,
ClickHouse también proporciona un Float32 para los casos en que la precisión es menos crítica y
la compresión es prioritaria.
Cadenas
VARCHAR de Snowflake almacena caracteres Unicode en UTF-8, lo que permite al usuario
especificar una longitud máxima. Esta longitud no afecta al almacenamiento ni al
rendimiento, ya que siempre se utiliza el número mínimo de bytes para almacenar una cadena, y
más bien solo impone restricciones útiles para las herramientas posteriores. Otros tipos, como
Text y NChar, son simplemente alias de este tipo. ClickHouse, por el contrario,
almacena todos los datos de cadena como bytes sin procesar con un tipo String
(no es necesario especificar una longitud), dejando la codificación en manos del usuario, con
funciones en tiempo de consulta
disponibles para distintas codificaciones. Remitimos al lector a “Opaque data argument”
para entender la motivación de este enfoque. Por tanto, la implementación de String en ClickHouse es más comparable
al tipo Binary de Snowflake. Tanto Snowflake
como ClickHouse
admiten “collation”, lo que permite a los usuarios definir cómo se ordenan y comparan las cadenas.
Tipos semiestructurados
VARIANT, OBJECT y ARRAY para datos semiestructurados.
ClickHouse ofrece los tipos equivalentes Variant,
Object (actualmente obsoleto en favor del tipo JSON nativo) y Array.
Además, ClickHouse cuenta con el
tipo JSON, que sustituye al ya obsoleto tipo Object('json') y destaca especialmente
por su rendimiento y eficiencia de almacenamiento en comparación con otros tipos JSON nativos.
ClickHouse también admite Tuples con nombre y arrays de Tuples
mediante el tipo Nested,
lo que permite a los usuarios mapear explícitamente estructuras anidadas. Esto permite aplicar codecs y
optimizaciones de tipos en toda la jerarquía, a diferencia de Snowflake, que
requiere que el usuario utilice los tipos OBJECT, VARIANT y ARRAY para el objeto
externo y no permite el tipado interno explícito.
Este tipado interno también simplifica las consultas sobre valores numéricos anidados en ClickHouse,
que no necesitan convertirse mediante cast y pueden usarse en definiciones de índices.
En ClickHouse, los codecs y los tipos optimizados también pueden aplicarse a subestructuras.
Esto ofrece la ventaja adicional de que la compresión con estructuras anidadas sigue siendo
excelente y comparable a la de los datos aplanados. En cambio, debido a la
imposibilidad de aplicar tipos específicos a las subestructuras, Snowflake recomienda aplanar
los datos para lograr una compresión óptima.
Snowflake también impone restricciones de tamaño
para estos tipos de datos.
Referencia de tipos
| Snowflake | ClickHouse | Nota | |
|---|---|---|---|
NUMBER | Decimal | ClickHouse admite el doble de precisión y de escala que Snowflake: 76 dígitos frente a 38. | |
FLOAT, FLOAT4, FLOAT8 | Float32, Float64 | Todos los tipos de punto flotante de Snowflake son de 64 bits. | |
VARCHAR | String | ||
BINARY | String | ||
BOOLEAN | Bool | ||
DATE | Date, Date32 | DATE en Snowflake ofrece un rango de fechas más amplio que ClickHouse; por ejemplo, el mínimo de Date32 es 1900-01-01 y el de Date es 1970-01-01. Date en ClickHouse ofrece un almacenamiento más eficiente en costos (de dos bytes). | |
TIME(N) | No tiene un equivalente directo, pero se puede representar con DateTime y DateTime64(N). | DateTime64 utiliza el mismo concepto de precisión. | |
TIMESTAMP - TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ | DateTime y DateTime64 | DateTime y DateTime64 pueden tener opcionalmente un parámetro TZ definido para la columna. Si no se especifica, se usa la zona horaria del servidor. Además, el cliente dispone del parámetro --use_client_time_zone. | |
VARIANT | JSON, Tuple, Nested | El tipo JSON es experimental en ClickHouse. Este tipo infiere los tipos de las columnas al insertar. Como alternativa, Tuple, Nested y Array también pueden usarse para crear estructuras con tipos definidos explícitamente. | |
OBJECT | Tuple, Map, JSON | Tanto OBJECT como Map son análogos al tipo JSON de ClickHouse, donde las claves son de tipo String. ClickHouse requiere que el valor sea consistente y esté fuertemente tipado, mientras que Snowflake usa VARIANT. Esto significa que los valores de distintas claves pueden ser de tipos diferentes. Si esto es necesario en ClickHouse, defina explícitamente la jerarquía mediante Tuple o recurra al tipo JSON. | |
ARRAY | Array, Nested | ARRAY en Snowflake usa VARIANT para los elementos, un supertipo. En cambio, en ClickHouse estos están tipados de forma estricta. | |
GEOGRAPHY | Point, Ring, Polygon, MultiPolygon | Snowflake impone un sistema de coordenadas (WGS 84), mientras que ClickHouse lo aplica al momento de la consulta. | |
GEOMETRY | Point, Ring, Polygon, MultiPolygon |
| Tipo de ClickHouse | Descripción |
|---|---|
IPv4 y IPv6 | Tipos específicos de IP, que pueden permitir un almacenamiento más eficiente que en Snowflake. |
FixedString | Permite usar una longitud fija en bytes, lo que resulta útil para hashes. |
LowCardinality | Permite codificar cualquier tipo mediante diccionario. Es útil cuando se espera que la cardinalidad sea < 100k. |
Enum | Permite una codificación eficiente de valores con nombre en rangos de 8 o 16 bits. |
UUID | Para almacenar UUID de forma eficiente. |
Array(Float32) | Los vectores pueden representarse como un Array de Float32 con funciones de distancia compatibles. |