博客 / 产品

ClickHouse 23.6 版本发布

author avatar
ClickHouse 团队
2023年7月3日 - 3 分钟阅读

版本发布列车继续前进。

我们非常激动地分享 23.6 版本中的一系列惊艳功能。

而且,我们已经确定了 23.7 版本的发布日期,请立即注册参加 7 月 27 日上午 9:00(PDT)/ 晚上 6:00(CEST)的社区电话会议。

版本摘要

10 项新功能。12 项性能优化。31 个错误修复。

以下是突出功能的一小部分。但值得注意的是,一些功能现在已准备好投入生产或已默认启用。您可以在本文末尾找到这些功能。

Mongo 6.x 支持

如果说现代 Web 应用程序堆栈中几乎无处不在的数据存储有一个,那就是 MongoDB。MongoDB 是一个面向文档的数据库,旨在存储和检索类似 JSON 的数据。由于其专注于 JSON 和易用性,自 2009 年问世以来,Mongo 已被证明是数据存储的瑞士军刀,也是 Web 应用程序中用于状态存储的常见组件。

虽然 ClickHouse 一段时间以来通过表函数支持 MongoDB,但 Mongo v5.1 引入了协议更改,需要更新此集成。我们现在很高兴地宣布支持 Mongo 最新版本 v6。

对于不熟悉 ClickHouse 表函数的用户,这些函数提供了查询外部数据源的能力。这对于数据迁移任务非常有用,在数据迁移任务中,数据从数据源中提取并通过 INSERT INTO SELECT 命令插入到 ClickHouse 中,以及用于在 ClickHouse 中填充字典。或者,可以使用等效的表引擎来公开由外部存储支持的 ClickHouse 中的表,这些表又可以与驻留在 MergeTree 表中的数据连接。

Mongo 示例数据集提供了一些有用的示例来测试此功能。假设您已将这些数据集加载到您的 Mongo 或 Atlas 实例中,那么使用表函数查询它们将变得非常简单。在下面的示例中,我们查询了 Airbnb 房源数据集(为了简洁起见,仅采样了字段的子集),指定了“sample_airbnb”数据库和“listingsAndReviews”集合

提示:如果查询 Mongo Atlas,用户需要包含如下所示的设置 connectTimeoutMS=10000&ssl=true&authSource=admin。为 Atlas 公开的连接端点也不是有效的主机名。可以使用 atlas cli 和命令 atlas process list -o json 确定数据库的主机名。

SELECT listing_url, name, summary
FROM mongodb('<host>:27017', 'sample_airbnb', 'listingsAndReviews', 'default', '<password>', 'listing_url String, name String, summary String, space String, description String, room_type UInt32, bed_type UInt32, minimum_nights UInt32, maximum_nights UInt32, bedrooms UInt16, beds UInt16,number_of_reviews UInt16, amenities Array(String)', 'connectTimeoutMS=10000&ssl=true&authSource=admin')
LIMIT 1
FORMAT Vertical

Row 1:
──────
listing_url: https://www.airbnb.com/rooms/10006546
name:    	Ribeira Charming Duplex
summary: 	Fantastic duplex apartment with three bedrooms, located in the historic area of Porto, Ribeira (Cube) - UNESCO World Heritage Site. Centenary building fully rehabilitated, without losing their original character.

1 row in set. Elapsed: 0.483 sec.

注意:目前不支持 Mongo 中的 Decimal128 字段,这阻止了我们在此处使用价格。这将在未来的版本中解决,以及模式推断。

此函数同样可以用于计算 Mongo 上的聚合,其中过滤器被下推以最大程度地减少数据传输。在下面的示例中,我们计算了按房间类型和卧室数量划分的平均床位数。

SELECT room_type, bedrooms, round(avg(beds), 2) AS avg_beds
FROM mongodb('<host>:27017', 'sample_airbnb', 'listingsAndReviews', 'default', '<password>', 'listing_url String, name String, summary String, space String, description String, room_type String, bed_type UInt32, minimum_nights UInt32, maximum_nights UInt32, bedrooms UInt16, beds UInt16,number_of_reviews UInt16, amenities Array(String)', 'connectTimeoutMS=10000&ssl=true&socketTimeoutMS=10000&authSource=admin')
GROUP BY 1, 2
ORDER BY room_type ASC, bedrooms ASC

┌─room_type───────┬─bedrooms─┬─avg_beds─┐
│ Entire home/apt │    	01.34 │
│ Entire home/apt │    	11.53 │
│ Entire home/apt │    	22.81 │
│ Entire home/apt │    	34.13 │
│ Entire home/apt │    	45.56 │
│ Entire home/apt │    	56.26 │
│ Entire home/apt │    	68.14 │
│ Entire home/apt │    	78.5 │
│ Entire home/apt │    	88.67 │
│ Entire home/apt │    	915.5 │
│ Entire home/apt │   	1014.5 │
│ Private room	  │    	01.23 │
│ Private room	  │    	11.25 │
│ Private room	  │    	22.45 │
│ Private room	  │    	32.3 │
│ Private room	  │    	43.62 │
│ Private room	  │    	57.5 │
│ Private room	  │    	67 │
│ Private room	  │    	71 │
│ Private room	  │   	152 │
│ Private room	  │   	2025 │
│ Shared room 	  │    	12.53 │
└─────────────────┴──────────┴──────────┘

22 rows in set. Elapsed: 0.760 sec. Processed 5.55 thousand rows, 149.26 KB (7.31 thousand rows/s., 196.32 KB/s.)

如果我们为 Mongo 实例创建一个表引擎,则可以简化上述查询。这使我们能够将 Mongo 集合公开为 ClickHouse 中的表。在下面的示例中,我们使用它将数据集加载到 Mergetree 表引擎中。

CREATE TABLE listings_mongo
(
	`listing_url` String,
	`name` String,
	`summary` String,
	`space` String,
	`description` String,
	`room_type` String,
	`bed_type` UInt32,
	`minimum_nights` UInt32,
	`maximum_nights` UInt32,
	`bedrooms` UInt16,
	`beds` UInt16,
	`number_of_reviews` UInt16,
	`amenities` Array(String)
)
ENGINE = MongoDB('<host>:27017', 'sample_airbnb', 'listingsAndReviews', 'default', '<password>', 'connectTimeoutMS=10000&ssl=true&socketTimeoutMS=10000&authSource=admin')

— simpler syntax now possible
SELECT room_type, bedrooms, round(avg(beds), 2) AS avg_beds
FROM listings_mongo
GROUP BY 1, 2
ORDER BY room_type ASC, bedrooms ASC

— migrate data to ClickHouse
CREATE TABLE listings_merge
ENGINE = MergeTree
ORDER BY listing_url AS
SELECT *
FROM listings

Ok.

0 rows in set. Elapsed: 1.369 sec. Processed 5.55 thousand rows, 11.42 MB (4.06 thousand rows/s., 8.34 MB/s.)

最后,Mongo 数据集通常用作字典的来源。有关更多详细信息,请参阅此处

转换函数

数据处理中常见的问题是需要映射值 - 通常是将代码映射为有意义的内容。此任务最好在 SQL 中使用 transform 函数执行。ClickHouse 一段时间以来一直支持此函数用于数字、日期和字符串(前提是源值和目标值是同一类型),甚至用于加载流行的英国房价数据集,如下所示。在这里,我们在插入时将房屋类型的代码映射为更易读的值。

CREATE TABLE uk_price_paid
(
	price UInt32,
	date Date,
	postcode1 LowCardinality(String),
	postcode2 LowCardinality(String),
	type Enum8('terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'other' = 0),
	is_new UInt8,
	duration Enum8('freehold' = 1, 'leasehold' = 2, 'unknown' = 0),
	addr1 String,
	addr2 String,
	street LowCardinality(String),
	locality LowCardinality(String),
	town LowCardinality(String),
	district LowCardinality(String),
	county LowCardinality(String)
)
ENGINE = MergeTree
ORDER BY (postcode1, postcode2, addr1, addr2);

INSERT INTO uk_price_paid
WITH
   splitByChar(' ', postcode) AS p
SELECT
	toUInt32(price_string) AS price,
	parseDateTimeBestEffortUS(time) AS date,
	p[1] AS postcode1,
	p[2] AS postcode2,
	transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type,
	b = 'Y' AS is_new,
	transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration, addr1, addr2, street, locality, town, district, county
FROM url(
'http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv', 'CSV','uuid_string String, price_string String, time String, postcode String, a String, b String, c String, addr1 String, addr2 String, street String, locality String, town String, district String, county String, d String, e String'
) SETTINGS max_http_get_redirects=10;

在 23.6 版本中,我们为此函数添加了对所有数据类型的支持。transform 函数现在可用于将列转换为其他类型。还支持 DateTime64 和 Decimal 等类型,以及处理 Null 值的能力。对于一个简单的示例,请对比下面 23.5 和 23.6 版本的响应差异

--23.5
SELECT transform(number, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'], NULL) AS numbers
FROM system.numbers
LIMIT 10

┌─numbers─┐
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
│ ᴺᵁᴸᴸ	  │
└─────────┘

10 rows in set. Elapsed: 0.003 sec.

--23.6
SELECT transform(number, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'], NULL) AS numbers
FROM system.numbers
LIMIT 10

┌─numbers─┐
│ zero	  │
│ one 	  │
│ two 	  │
│ three   │
│ four	  │
│ five	  │
│ six 	  │
│ seven   │
│ eight   │
│ nine	  │
└─────────┘

10 rows in set. Elapsed: 0.001 sec.

对几乎排序的数据进行排序

ClickHouse 喜欢排序的数据。作为面向列的数据库,插入时对数据进行排序对于查询性能至关重要,并且是用户在创建表时需要指定 ORDER BY 子句时遇到的早期概念之一。此子句指定了数据将在磁盘上排序的列列表,该列表应与用户访问模式对齐,以确保最佳查询性能。虽然这些排序键是每个 ClickHouse 用户调整性能的首选工具,但在此时指定所有列仍然是不现实的。尽管如此,某些列自然会排序并与这些排序键对齐。

在 23.6 版本中,ClickHouse 现在将利用数据中的任何自然排序模式来提高查询性能。这在列已知在大多数情况下单调递增但不是排序键的一部分的情况下尤其如此。

新贡献者

特别欢迎所有 23.6 版本的新贡献者!ClickHouse 的受欢迎程度在很大程度上归功于贡献社区的努力。看到社区不断壮大总是令人感到荣幸。

如果您在这里看到您的名字,请与我们联系......但我们也会在 Twitter 等平台上找到您。

Chang Chen, Dmitry Kardymon, Hongbin Ma, Julian Maicher, Thomas Panetti, YalalovSM, kevinyhzou, tpanetti, 郭小龙

分享这篇文章

订阅我们的新闻通讯

随时了解功能发布、产品路线图、支持和云服务!
正在加载表单...
关注我们
X imageSlack imageGitHub image
Telegram imageMeetup imageRss image
©2025ClickHouse, Inc. 总部位于加利福尼亚州湾区和荷兰阿姆斯特丹。