数据类型
数值类型
Float64 类型则提供了
更大的取值范围,但会损失一定精度。
相比之下,ClickHouse 为浮点数和整数提供了多种有符号和无符号的
精度选项。借助这些类型,你可以明确指定整数所需的精度,
以优化存储和内存开销。与 Snowflake 的 Number 类型等价的
Decimal 类型,还提供了两倍的 precision 和 scale,上限可达 76 位。
除了类似的 Float64 类型外,
ClickHouse 还提供了 Float32,适用于对精度要求不那么高而
更看重压缩效果的场景。
字符串
VARCHAR 以 UTF-8 编码存储 Unicode 字符,并允许用户指定最大长度。这个长度对存储或性能没有影响,系统始终会使用最少的字节数来存储字符串;它更多只是用于提供对下游工具有帮助的约束。其他类型 (如 Text 和 NChar) 都只是该类型的别名。相比之下,ClickHouse 使用 String 类型将所有字符串数据按原始字节存储 (无需指定长度) ,并将编码处理交由用户决定,同时提供适用于不同编码的查询时函数。关于这样设计背后的原因,我们建议读者参阅 “Opaque data argument”。因此,从实现方式来看,ClickHouse 的 String 更接近 Snowflake 的 Binary 类型。Snowflake 和 ClickHouse 都支持“排序规则”,允许用户覆盖字符串的排序和比较方式。
半结构化类型
VARIANT、OBJECT 和 ARRAY 类型。
ClickHouse 提供了对应的 Variant、
Object (现已弃用,推荐改用原生 JSON 类型) 和 Array
类型。此外,ClickHouse 还提供了 JSON
类型,用于替代现已弃用的 Object('json') 类型,并且与其他原生 JSON 类型相比在
性能和存储效率方面尤为出色。
ClickHouse 还通过 Nested 类型
支持具名 Tuples 和 Tuple 数组,
使用户能够显式映射嵌套结构。这样便可以在整个层级中应用编解码器和类型
优化;而 Snowflake 则不同,它要求用户对外层
对象使用 OBJECT、VARIANT 和 ARRAY 类型,并且不允许显式定义内部类型。
这种内部类型定义也简化了 ClickHouse 中对嵌套数值的查询,
因为它们无需进行类型转换,并且可用于索引定义。
在 ClickHouse 中,编解码器和优化类型也可以应用到子结构。
这还带来了额外的好处:嵌套结构的压缩效果
依然非常出色,并且可与扁平化数据相媲美。相比之下,由于
无法将特定类型应用到子结构,Snowflake 建议将数据扁平化,
以获得最佳压缩效果。
Snowflake 还对这些数据类型施加了大小限制。
类型参考
| Snowflake | ClickHouse | 说明 | |
|---|---|---|---|
NUMBER | Decimal | ClickHouse 支持的精度和标度是 Snowflake 的两倍:76 位,而 Snowflake 为 38 位。 | |
FLOAT, FLOAT4, FLOAT8 | Float32, Float64 | Snowflake 中所有浮点类型均为 64 位。 | |
VARCHAR | String | ||
BINARY | String | ||
BOOLEAN | Bool | ||
DATE | Date, Date32 | Snowflake 中的 DATE 支持的日期范围比 ClickHouse 更广,例如 Date32 的最小值为 1900-01-01,而 Date 的最小值为 1970-01-01。ClickHouse 中的 Date 提供了更具成本效益的存储方式 (两字节) 。 | |
TIME(N) | 没有完全对应的类型,但可以用 DateTime 和 DateTime64(N) 来表示。 | DateTime64 在精度方面采用相同的概念。 | |
TIMESTAMP - TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ | DateTime 和 DateTime64 | DateTime 和 DateTime64 可以选择为该列指定 TZ 参数。若未指定,则使用服务器的时区。此外,客户端还可使用 --use_client_time_zone 参数。 | |
VARIANT | JSON, Tuple, Nested | 在 ClickHouse 中,JSON 类型目前仍属 Experimental。该类型会在写入时推断列的数据类型。也可以改用 Tuple、Nested 和 Array 来显式构建类型结构。 | |
OBJECT | Tuple, Map, JSON | OBJECT 和 Map 都类似于 ClickHouse 中键为 String 的 JSON 类型。ClickHouse 要求值保持一致且具备强类型,而 Snowflake 使用 VARIANT。这意味着不同键对应的值可以是不同类型。如果在 ClickHouse 中需要这种能力,可以使用 Tuple 显式定义层级结构,或直接使用 JSON 类型。 | |
ARRAY | 数组, 嵌套 | Snowflake 中的 ARRAY 使用 VARIANT 作为元素类型——即一种超类型。相比之下,ClickHouse 中的这些元素是强类型的。 | |
GEOGRAPHY | Point, Ring, Polygon, MultiPolygon | Snowflake 强制采用坐标系 (WGS 84) ,而 ClickHouse 则在查询时应用该坐标系。 | |
GEOMETRY | Point, Ring, Polygon, MultiPolygon |
| ClickHouse 类型 | 描述 |
|---|---|
IPv4 和 IPv6 | IP 专用类型,相比 Snowflake 可能具有更高的存储效率。 |
FixedString | 支持使用固定长度的字节,这对哈希值很有用。 |
LowCardinality | 支持对任意类型进行字典编码。在预期基数 < 100k 时非常有用。 |
Enum | 支持在 8 位或 16 位范围内对命名值进行高效编码。 |
UUID | 用于高效存储 UUID。 |
Array(Float32) | 向量可表示为由 Float32 组成的 Array,并支持距离函数。 |