ClickHouse 2023-12-01 883

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类型数据

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;

综合案例

-- 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. 适合存储标签、多值属性等场景
分享:
返回文章列表