版本发布列车继续前行。我们非常高兴地分享 23.2 版本的更新。
并且,我们已经确定了 23.3 版本的发布日期,请立即注册参加 3 月 30 日上午 9:00(太平洋标准时间)/ 下午 6:00(中欧夏令时)的社区电话会议。
版本摘要
-
18 项新功能。
-
30 项性能优化。
-
43 个错误修复。
多个 SQL 语言功能和扩展集成支持。但一如既往,有一些值得关注的重点项目
多阶段 PREWHERE (Alexander Gololobov)
PREWHERE
子句自 ClickHouse 首个开源版本发布以来一直是其一项功能。此优化旨在减少查询需要读取的行数,并在 22.2 之前的版本中使用了一个两步执行过程。当查询运行时,首先使用表的 primary key 识别需要读取的数据块。这将识别出一组数据块,每个数据块包含一定数量的行(默认情况下为 8192 行)。但是,并非这些数据块中的所有行都与 primary key 上的过滤器子句匹配 - 因为数据块可以包含一系列值,或者因为 WHERE 条件未使用 primary key。因此,为了识别正确的行并在读取 SELECT
列之前,需要进行额外的过滤。这在使用 PREWHERE 的读取第二阶段中执行,这允许在 WHERE 子句中进一步过滤 primary key 和非 primary key 列。这需要以线性扫描的方式读取和过滤数据块。
ClickHouse 会根据内部启发式算法将列移动到 PREWHERE 阶段。用户也可以手动指定要使用的列,在自动选择效果不佳时,使用显式的 PREWHERE
子句。这些列中的每一个都将在读取的第二阶段独立过滤,并且只有满足所有条件的行才会在管道的后续阶段读取。
我们在下面对此进行了可视化
在 23.2 版本中,此预过滤优化已拆分为多个步骤。列按从最小到最大(未压缩大小)的顺序进行过滤。从应用于列的过滤器中识别的行可用于进一步减少后续步骤中扫描的数据块。随着每个步骤变得更加高效,所有步骤的总成本都会降低。我们在下面对此进行了说明
此行为目前需要通过设置 enable_multiple_prewhere_read_steps=1
来启用。设置后,在大多数情况下将 move_all_conditions_to_prewhere
设置为 1 也是有意义的。虽然尚未默认启用,但我们建议用户在他们的查询中尝试此功能,并在我们的Slack 社区或作为GitHub 问题报告他们的发现。我们预计将看到明显的性能改进,尤其是在按大列进行过滤时。
Iceberg,即将到来 - 对 Apache Iceberg 的支持 (ucasFL)
23.2 版本引入了对Apache Iceberg 格式的读取支持。
什么是 Apache Iceberg?
Apache Iceberg 最初由 Netflix 开发,是一种高性能的表格式,独立于任何特定的 SQL 引擎 - 允许任何 SQL 引擎查询它,现在包括 ClickHouse!
这种表格式越来越受欢迎,并迅速成为数据湖中管理数据的行业标准。虽然 Parquet 已确立了自己作为数据湖首选数据文件格式的地位,但表通常表示为存储桶或文件夹中的一组文件。这对于临时查询通常足够了,但使得管理大型数据集变得繁琐,并且意味着 ClickHouse 等工具的表抽象充其量是松散建立的,并且不支持模式演变或写入一致性。对 ClickHouse 来说最重要的是,这种方法将依赖于文件列表操作 - 在诸如 s3 之类的对象存储上可能代价高昂。数据过滤需要打开和读取所有数据,除了使用命名方案上的 glob 模式来限制文件的一些有限能力之外。
Iceberg 旨在通过以开放且可访问的方式为数据湖中的文件带来类似 SQL 表的功能来解决这些挑战。具体来说,Iceberg 提供
- 支持模式演变以跟踪随时间推移对表的更改
- 能够创建定义特定版本的数据快照。可以查询这些版本,允许用户在不同版本之间“时间旅行”。
- 支持快速回滚到数据先前版本
- 文件的自动分区以帮助过滤 - 从历史上看,用户需要手动执行此容易出错的任务并在更新中维护它。
- 查询引擎可用于提供高级计划和过滤的元数据。
这些表功能由清单文件提供。这些清单维护基础数据文件的历史记录,并包含其模式、分区和文件信息的完整描述。这种抽象允许支持不可变快照,这些快照以分层结构有效地组织,并跟踪表随时间推移的所有更改。
重要的是,基础文件格式没有改变,Apache Iceberg 支持 Parquet、ORC 和 Avro。
ClickHouse 支持
ClickHouse 目前通过 iceberg
表函数和 Iceberg
表引擎支持读取 v1(v2 支持即将推出!)版本的 Iceberg 格式。下面我们提供了这些函数针对房屋价格数据集的示例,方法是计算过去 20 年中英格兰平均最昂贵的城镇及其最昂贵的街道。这些查询应该可以在您自己的 ClickHouse 实例上重现,此数据集是公开的。
使用表函数
SELECT
town,
round(avg(price)) AS avg_price,
argMax(street, price) AS street
FROM iceberg('https://datasets-documentation.s3.eu-west-3.amazonaws.com/house_prices_iceberg/')
GROUP BY town
HAVING street != ''
ORDER BY avg(price) DESC
LIMIT 10
┌─town──────────────┬─avg_price─┬─street─────────┐
│ GATWICK │ 28232812 │ NORTH TERMINAL │
│ VIRGINIA WATER │ 903457 │ WEST DRIVE │
│ CHALFONT ST GILES │ 830274 │ PHEASANT HILL │
│ COBHAM │ 720600 │ REDHILL ROAD │
│ BEACONSFIELD │ 690689 │ AYLESBURY END │
│ ESHER │ 638641 │ COPSEM LANE │
│ KESTON │ 606303 │ WESTERHAM ROAD │
│ GERRARDS CROSS │ 601461 │ NARCOT LANE │
│ ASCOT │ 559106 │ BAGSHOT ROAD │
│ WEYBRIDGE │ 552827 │ THE HEIGHTS │
└───────────────────┴───────────┴────────────────┘
10 rows in set. Elapsed: 18.151 sec. Processed 27.07 million rows, 1.37 GB (1.49 million rows/s., 75.50 MB/s.)
使用表引擎的等效查询
CREATE TABLE house_iceberg
ENGINE = Iceberg('https://datasets-documentation.s3.eu-west-3.amazonaws.com/house_prices_iceberg/')
SELECT
town,
round(avg(price)) AS avg_price,
argMax(street, price) AS street
FROM house_iceberg
GROUP BY town
HAVING street != ''
ORDER BY avg(price) DESC
LIMIT 10
除了 v2 支持外,我们还计划在将来的版本中支持查询特定快照 - 目前 ClickHouse 仅查询最新的快照。此外,Iceberg 提供的元数据文件包含数据文件本身的列统计信息,例如,我们计划利用列的上限来避免数据读取操作。
支持相关矩阵 (来自腾讯的FFFFFFFHHHHHHH)
在 ClickHouse 23.2 版本中,我们增加了对计算相关矩阵的支持。简单来说,相关矩阵是一个表格,包含了表格中所有可能取值之间的相关系数。这提供了一种简单的方法来总结大型数据集并识别强正相关或强负相关的列。许多统计分析技术都使用相关矩阵,但在 ClickHouse 中,传统上需要使用非常复杂的查询或多个查询才能计算出相关矩阵。借助新的 corrMatrix
函数,现在这个查询变得非常简单。
以下示例展示了如何计算一些 GitHub 指标的相关矩阵,这些指标通常受到开发人员密切关注,尤其是 Star 数。我们将结果限制在 Star 数至少为 100 的仓库。为此,我们使用了 GitHub Events 数据集,该数据集在我们的 测试数据集 文档中进行了说明,并且在我们的演示环境 play.clickhouse.com 中提供,用户可以对其进行查询。
SELECT arrayMap(x -> round(x, 3), arrayJoin(corrMatrix(stars, issue_raised, follows, prs, forks, commit_comment_event, issues_commented))) AS correlation_matrix
FROM
(
SELECT
countIf(event_type = 'WatchEvent') AS stars,
countIf(event_type = 'IssuesEvent') AS issue_raised,
countIf(event_type = 'FollowEvent') AS follows,
countIf(event_type = 'PullRequestEvent') AS prs,
countIf(event_type = 'ForkEvent') AS forks,
countIf(event_type = 'CommitCommentEvent') AS commit_comment_event,
countIf(event_type = 'IssueCommentEvent') AS issues_commented
FROM github_events
GROUP BY repo_name
HAVING stars > 100
)
┌─correlation_matrix──────────────────────┐
│ [1,0.298,0.003,0.22,0.552,0.063,0.291] │
│ [0.298,1,0.035,0.376,0.223,0.104,0.557] │
│ [0.003,0.035,1,0.004,0.004,0.015,0.003] │
│ [0.22,0.376,0.004,1,0.277,0.151,0.685] │
│ [0.552,0.223,0.004,0.277,1,0.057,0.262] │
│ [0.063,0.104,0.015,0.151,0.057,1,0.175] │
│ [0.291,0.557,0.003,0.685,0.262,0.175,1] │
└─────────────────────────────────────────┘
7 rows in set. Elapsed: 44.847 sec. Processed 5.72 billion rows, 51.60 GB (127.65 million rows/s., 1.15 GB/s.)
请记住,矩阵中每个单元格的值代表 皮尔逊相关系数,其中 1 表示强线性关系,-1 表示负相关关系,0 表示没有相关性。
上述矩阵最好使用热力图进行可视化。下面我们使用 Superset 进行可视化。
我们留给读者自行得出结论,但 Star 数似乎与其他仓库活动的相关性很差,除了可能与 Fork 数之间存在一定相关性。
Amazon MSK 支持 (Mark Zitnik)
上个月,我们 宣布了 ClickHouse 开源 Kafka Connect Sink 的 Beta 版本。为了满足社区的需求,我们现在宣布该连接器与 AWS 托管服务 MSK 完全兼容。
Metabase 插件 GA 版本发布 (Serge Klochkov)
在 ClickHouse,我们坚信支持我们的开源生态系统对于促进采用和确保用户成功至关重要。本着这种精神,本月我们 宣布了 ClickHouse 插件的 GA 版本,该插件适用于开源可视化工具 Metabase。与 Metabase 团队合作,该插件现在也可在 Metabase Cloud 中使用。对于需要 ClickHouse 可视化工具的用户,我们建议观看我们与 Metabase 团队朋友一起进行的 近期网络研讨会。