老张
数据库架构师
ClickHouse作为一款高性能的列式数据库,提供了丰富的复合数据类型,其中Array类型是最常用的之一。本文将详细介绍ClickHouse中Array类型的使用方法和最佳实践。
Array(T)是ClickHouse中的复合数据类型,用于存储相同类型元素的有序集合。其中T是数组元素的类型,可以是:
Array(T) 其中T表示数组中元素的类型,例如:
CREATE TABLE example (
id UInt32,
tags Array(String), -- 字符串数组
scores Array(Float64), -- 浮点数数组
counts Array(UInt32) -- 整数数组
) ENGINE = MergeTree()
ORDER BY id; | 场景 | 说明 | 示例 |
|---|---|---|
| 标签/分类信息 | 一个实体有多个标签 | tags Array(String) |
| 多值属性 | 一个订单有多个商品ID | items Array(UInt32) |
| 时间序列/指标数据 | 某个时间段内采集的多个数值 | values Array(Float64) |
ClickHouse支持用方括号[]直接表示数组:
INSERT INTO example (id, tags, scores, counts) VALUES
(1, ['tag1', 'tag2'], [95.5, 89.0], [1, 2]),
(2, ['tag3', 'tag4', 'tag5'], [91.0, 87.5, 90.0], [3, 4, 5]); SELECT id, tags FROM example; SELECT id, length(tags) AS tag_count FROM example; ClickHouse数组索引从1开始:
SELECT
id,
tags[1] AS first_tag,
scores[2] AS second_score
FROM example; | 函数 | 说明 | 示例 |
|---|---|---|
| length(array) | 返回数组长度 | length(tags) |
| arrayElement(arr, n) | 获取第n个元素 | tags[1] |
| has(array, value) | 判断数组是否包含值 | has(tags, 'tag1') |
| arrayJoin(array) | 将数组展开为多行 | arrayJoin(tags) |
SELECT
id,
arrayJoin(tags) AS single_tag
FROM example; -- 判断数组是否包含值
SELECT * FROM example WHERE has(tags, 'tag1');
-- 判断数组长度
SELECT * FROM example WHERE length(tags) > 0; | 特性 | Array(T) | JSON |
|---|---|---|
| 类型安全 | ✅ 是 | ❌ 否 |
| 查询效率 | ✅ 高 | ❌ 较低 |
| 灵活性 | ❌ 元素类型固定 | ✅ 可存储任意结构 |
-- 1. 建表
CREATE TABLE user_tags (
user_id UInt32,
tags Array(String),
scores Array(Float64)
) ENGINE = MergeTree()
ORDER BY user_id;
-- 2. 插入数据
INSERT INTO user_tags VALUES
(1, ['music', 'sports'], [9.5, 8.0]),
(2, ['books', 'travel', 'food'], [9.0, 9.5, 8.5]),
(3, ['tech'], [10.0]);
-- 3. 查询
SELECT
user_id,
tags,
length(tags) AS tag_count,
tags[1] AS first_tag
FROM user_tags;
-- 4. 展开数组
SELECT
user_id,
arrayJoin(tags) AS tag
FROM user_tags; ClickHouse的Array类型提供了强大的功能来处理多值数据: