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;
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;
-- 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类型提供了强大的功能来处理多值数据: