「Clickhouse Array 的力量」1-1

1,060 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。


ClickHouse 贡献者经常添加超越标准SQL的分析功能。这种设计方法在成功的开源项目中很常见,并且反映了以创造性的方式解决现实世界的问题的偏向。

数组就是一个很好的例子。大多数现代数据库都有数组数据类型,但它们的功能往往是有限的。ClickHouse则完全不同:它创造性地将数组与聚合和函数式编程结合起来,创造了一个全新的处理模型。

这篇文章由多部分组成其中有对 ClickHouse Array 的概述,同时会附带具体的例子驱动。我们从基本功能开始,比如定义和加载数组数据,使用数组函数,以及将数组展开为表格格式。这些使ClickHouse 用户能够处理具有任意参数的时间序列。

我们在此基础上探索聚合和数组的关系,以及展示使用lambdas和复杂数组函数的函数式编程的例子。高级功能使我们能够解决诸如建立分析漏斗和线性插值的问题。

要记住:我们的目标是展示什么是数组,以及为什么要使用它们。

Array 基础

在ClickHouse中,数组只是另一种列数据类型,它代表一个值的集合(vector)。下面是一个在ClickHouse表中使用数组的简单例子:

/* create table */
CREATE TABLE array_test (
  floats Array(Float64),
  strings Array(String),
  nullable_strings Array(Nullable(String))
) ENGINE=TinyLog

使用数组很容易,特别是如果你熟悉 Python/Javascript 等流行的编程语言。

你可以用 [] 创建数组值,并从其中选择单个值,同样用 []。下面是一个插入数组值并以不同方式再次选择它们的例子。遵循SQL传统,ClickHouse数组索引从1开始,而不是0:

INSERT INTO array_test 
VALUES([1.0, 2.5], ['a', 'c'], ['A', NULL, 'C'])

SELECT floats[1] AS v1, strings[2] AS v2, nullable_strings 
FROM array_test

/* sql answer*/
┌─v1─┬─v2─┬─nullable_strings─┐
│  1 │ c  │ ['A',NULL,'C']   │
└────┴────┴──────────────────┘

ClickHouse有一个丰富的数组函数库。**你不需要特意去建一个 table 来演示使用,相反它很容易定义数组常量,如下例所示。**这是一个快速测试函数行为的好方法:

SELECT 
    [1, 2, 4] AS array,
    has(array, 2) AS v1,
    has(array, 5) AS v2,
    length(array) AS v3

/* sql answer*/
┌─array───┬─v1─┬─v2─┬─v3─┐
│ [1,2,4] │  103 │
└─────────┴────┴────┴────┘

基本的数组行为就这么多了。关于更多的细节,请查看 ClickHouse关于数组数据类型 的文档。同时,我们将开始把数组用于解决分析问题。