Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Migración de Snowflake a ClickHouse

Tipos de datos

Numéricos

Los usuarios que trasladan datos entre ClickHouse y Snowflake notarán de inmediato que ClickHouse ofrece una mayor granularidad en la definición de tipos numéricos. Por ejemplo, Snowflake ofrece el tipo Number para valores numéricos. Esto requiere que el usuario especifique una precisión (número total de dígitos) y una escala (dígitos a la derecha del separador decimal), hasta un total de 38. Las declaraciones de enteros son equivalentes a Number y simplemente definen una precisión y una escala fijas, con el mismo rango. Esta comodidad es posible porque modificar la precisión (la escala es 0 para enteros) no afecta al tamaño de los datos en disco en Snowflake: se utilizan los bytes mínimos necesarios para un rango numérico en el momento de la escritura, a nivel de micropartición. Sin embargo, la escala sí afecta al espacio de almacenamiento, aunque esto se compensa con compresión. Un tipo 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

ClickHouse y Snowflake adoptan enfoques distintos para el almacenamiento de datos de cadenas. El 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

Snowflake admite los tipos 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.

Por último, ClickHouse ofrece la capacidad única de almacenar el estado de las funciones de agregación. Este estado es específico de la implementación, pero permite almacenar el resultado de una agregación y consultarlo posteriormente (con las funciones de combinación correspondientes). Normalmente, esta funcionalidad se usa mediante una vista materializada y, como se muestra a continuación, permite mejorar el rendimiento de consultas específicas con un coste de almacenamiento mínimo al almacenar el resultado incremental de las consultas sobre los datos insertados (más detalles aquí).

Navigation