ClickHouse 2023-12-05 697

ClickHouse中的Array字段详解

老张

数据库架构师

ClickHouse作为一款高性能的列式数据库,提供了丰富的复合数据类型,其中Array类型是最常用的之一。本文将详细介绍ClickHouse中Array类型的使用方法和最佳实践。

Array类型基础

Array(T)是ClickHouse中的复合数据类型,用于存储相同类型元素的有序集合。其中T是数组元素的类型,可以是:

  • 基本类型:Int32、String、Float64等
  • 复合类型:Nested、Tuple等

基本语法

Array(T)

其中T表示数组中元素的类型,例如:

  • Array(String) - 字符串数组
  • Array(Int32) - 32位整数数组
  • Array(Float64) - 64位浮点数数组

建表示例

CREATE TABLE example (
    id UInt32,
    tags Array(String),           -- 字符串数组
    scores Array(Float64),        -- 浮点数数组
    counts Array(UInt32)          -- 整数数组
) ENGINE = MergeTree()
ORDER BY id;

Array类型常见用途

场景 说明 示例
标签/分类信息 一个实体有多个标签 tags Array(String)
多值属性 一个订单有多个商品ID items Array(UInt32)
时间序列/指标数据 某个时间段内采集的多个数值 values Array(Float64)

插入Array类型数据

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]);

查询Array类型数据

1. 基本查询

SELECT id, tags FROM example;

2. 查询数组长度

SELECT id, length(tags) AS tag_count FROM example;

3. 访问数组元素

ClickHouse数组索引从1开始:

SELECT
    id,
    tags[1] AS first_tag,
    scores[2] AS second_score
FROM example;

常用Array函数

函数 说明 示例
length(array) 返回数组长度 length(tags)
arrayElement(arr, n) 获取第n个元素 tags[1]
has(array, value) 判断数组是否包含值 has(tags, 'tag1')
arrayJoin(array) 将数组展开为多行 arrayJoin(tags)

高级用法

1. arrayJoin展开数组

SELECT
    id,
    arrayJoin(tags) AS single_tag
FROM example;

2. WHERE条件过滤

-- 判断数组是否包含值
SELECT * FROM example WHERE has(tags, 'tag1');

-- 判断数组长度
SELECT * FROM example WHERE length(tags) > 0;

Array与JSON对比

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

  1. 定义简单直观:Array(T)
  2. 支持多种元素类型:String、Int、Float等
  3. 提供丰富的数组操作函数
  4. 性能优化良好,查询效率高
  5. 适合存储标签、多值属性等场景
分享: