发布列车持续前进。
我们非常激动地分享 23.7 版本中的一系列惊艳功能
并且,我们已经确定了 23.8 版本的发布日期,请立即注册,加入 8 月 31 日上午 9:00(PDT)/下午 6:00(CEST)的社区电话会议。
发布摘要
31 个新功能。
16 项性能优化。
47 个 bug 修复。
以下是突出显示功能的一小部分。但值得注意的是,一些功能现在已准备好投入生产或已默认启用。您可以在本文末尾找到这些功能。
新贡献者
特别欢迎所有 23.7 版本的新贡献者!ClickHouse 的普及很大程度上归功于社区的努力和贡献。看到社区不断壮大总是令人感到荣幸。
如果您在这里看到您的名字,请与我们联系...但我们也会在 Twitter 等平台上找到您。
Alex Cheng, AlexBykovski, Chen768959, John Spurlock, Mikhail Koviazin, Rory Crispin, Samuel Colvin, Sanjam Panda, Song Liyong, StianBerger, Vitaliy Pashkov, Yarik Briukhovetskyi, Zach Naimon, chen768959, dheerajathrey, lcjh, pedro.riera, therealnick233, timfursov, velavokr, xiao, xiaolei565, xuelei, yariks5s
Parquet 写入改进 (Michael Kolupaev)
最近几个月,ClickHouse 在 Parquet 文件格式方面进行了多项读取改进。除了并行化 跨行组的读取 和 利用元数据进行过滤 之外,我们甚至花时间确保了 Hugging Face 数据集的查询得到优化。我们深知这种文件格式非常普及,并且通常是使用 clickhouse-local 进行本地分析和数据迁移等任务的基础。我们不断致力于改进 Parquet 支持和对速度的执着追求已经获得了回报,并反映在我们最近的 公共基准测试 中反映的近期改进。
当然,读取 Parquet 只是故事的一半。用户总是需要将 ClickHouse 数据写入 Parquet,通常作为反向 ETL 工作流的一部分,或者需要共享数据分析的结果。因此,我们很高兴地宣布,从 23.7 版本开始,Parquet 写入速度提高了 6 倍。
让我们以 英国房价数据 为例进行说明。下面我们使用 clickhouse-local
并从现有的公开 S3 托管 Parquet 文件中导入数据。
CREATE TABLE uk_house_price
ENGINE = MergeTree
ORDER BY (postcode1, postcode2, addr1, addr2)
SETTINGS allow_nullable_key = 1 AS
SELECT *
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/uk-house-prices/parquet/house_prices.parquet')
0 rows in set. Elapsed: 40.550 sec. Processed 28.28 million rows, 4.67 GB (697.33 thousand rows/s., 115.15 MB/s.)
使用 23.6 版本导出此数据集仍然非常快,速度接近每秒 150 万行。
SELECT *
FROM uk_house_price
INTO OUTFILE 'london-prices.parquet'
28276228 rows in set. Elapsed: 19.901 sec. Processed 28.20 million rows, 4.66 GB (1.42 million rows/s., 233.98 MB/s.)
使用 23.7 版本导出相同的数据集显示出显著的改进,总时间几乎减半!您的实际情况可能会有所不同,改进幅度最高可达 6 倍。
SELECT *
FROM uk_house_price
INTO OUTFILE 'london-prices.parquet'
28276228 rows in set. Elapsed: 11.649 sec. Processed 28.24 million rows, 4.66 GB (2.42 million rows/s., 400.39 MB/s.)
默认启用稀疏列 (Anton Popov)
稀疏列一直是 ClickHouse 的一项功能,已有一段时间,但在 23.7 版本之前,需要显式启用。此优化旨在减少列写入的总数据量,方法是在检测到大量默认值时动态更改编码格式。除了提高压缩率外,这还具有提高查询性能和内存效率的优势。
在 23.7 版本中,此功能默认启用。用户应该会在可以应用此编码的情况下立即看到压缩和性能方面的改进。
在写入数据部分(在插入或合并时)时,ClickHouse 会计算每列的默认值比率。如果此比率超过配置的阈值,则仅写入该列的非默认值。为了保留哪些行具有默认值,会写入单独的流,其中包含偏移量的编码。此信息在查询时合并,确保优化对用户完全透明。下图显示了这方面的一个示例
对于 ① 包含稀疏值的列
s
,ClickHouse 仅将非默认值写入 ② 磁盘上的列文件,以及 ③ 包含非默认值偏移量的稀疏编码的附加文件:对于每个非默认值,我们存储非默认值之前直接存在的默认值数量。在查询时,我们使用此编码创建 ④ 具有直接偏移量的内存表示。稀疏编码的存储变体包含具有重复值的数据。
在 23.7 版本之前,用户需要通过修改控制稀疏列编码所需阈值的设置 - ratio_of_defaults_for_sparse_serialization 来显式启用稀疏列。此设置的默认值为 1.0,实际上禁用了该功能。在 23.7 版本中,此值的默认值为 0.9375。
虽然我们预计稀疏列即使对于高度结构化的数据也有好处,但我们预计对于用户插入具有不太严格的模式的数据(例如,具有高度可变键的 JSON)的用例,改进幅度会更大。在这些情况下,用户几乎无需为仅对少数行有值的列支付任何开销 - 这可能会显著节省空间。
虽然我们预计在我们的公共 ClickBench 基准测试中会有所改进,但默认启用此优化带来的好处规模令人惊喜。
PRQL 的实验性支持 (János Benjamin Antal)
在 ClickHouse,我们坚信 SQL 是所有查询语言的教父,它有能力解决几乎任何数据问题。纵观历史,无数语言竞相与 SQL 匹敌或取而代之,但成功程度各异。新的查询语言层出不穷,但也往往昙花一现。SQL 的持久性和其在许多数据存储系统中跨版本的集成证明了其持久的重要性。尽管如此,我们也承认让用户在熟悉的领域进行操作的重要性,并认识到某些语言比其他语言更适合某些用例。如果我们看到对某种查询语言有足够的采用和需求,我们可以考虑添加支持,并且始终欢迎社区 PR!感谢这样的社区贡献,PRQL 现在作为实验性功能在 ClickHouse 中得到支持。
PRQL(Pipelined Relational Query Language,管道式关系查询语言)发音为“Prequel”,将自身定位为“简单、强大、管道式的 SQL 替代品”。语法的管道性质已被证明很受欢迎,并且拥有不断壮大的贡献者社区。通过链接转换以形成管道,可以优雅地组合原本复杂的 SQL 查询。在 ClickHouse,我们可以看到这种查询构建风格具有一些潜在的有趣应用,尤其是在用户进行搜索和发现练习的用例中 - 可能是可观测性?
除了 文档齐全 之外,用户还可以使用 公共 Playground 进行实验。让我们考虑一些使用英国房价数据集的简单示例。假设希望找到伦敦最高价的地区
from uk_house_price
filter town == 'LONDON'
group district (
aggregate {
avg_price = average price
}
)
sort {-avg_price}
take 1..10
SELECT
district,
AVG(price) AS avg_price
FROM uk_house_price
WHERE town = 'LONDON'
GROUP BY district
ORDER BY avg_price DESC
LIMIT 10
┌─district───────────────┬──────────avg_price─┐
│ CITY OF LONDON │ 2016389.321229964 │
│ CITY OF WESTMINSTER │ 1107261.809839673 │
│ KENSINGTON AND CHELSEA │ 1105730.3371717487 │
│ CAMDEN │ 752077.7613715645 │
│ RICHMOND UPON THAMES │ 644835.3877018511 │
│ HAMMERSMITH AND FULHAM │ 590308.6679440506 │
│ HOUNSLOW │ 574833.3599378078 │
│ ISLINGTON │ 531522.146523729 │
│ HARLOW │ 500000 │
│ WANDSWORTH │ 464798.7692006684 │
└────────────────────────┴────────────────────┘
10 rows in set. Elapsed: 0.079 sec.
如图所示,ClickHouse 为我们提供了 PRQL 查询已编译成的等效 SQL 语句。
对于 SQL 经验不足的用户来说,更具挑战性的查询是找到每组中特定列的最高行。例如,下面我们找到英国每个邮政编码中最昂贵的房屋,并按价格排序。
from uk_house_price
filter town == 'LONDON'
filter postcode1 != ''
select {
postcode1, street, price
}
group postcode1 (
sort {-price}
take 1
)
sort {-price}
take 1..10
WITH table_0 AS
(
SELECT
postcode1,
street,
price
FROM uk_house_price
WHERE (town = 'LONDON') AND (postcode1 != '')
ORDER BY
postcode1 ASC,
price DESC
LIMIT 1 BY postcode1
)
SELECT
postcode1,
street,
price
FROM table_0
ORDER BY price DESC
LIMIT 10
┌─postcode1─┬─street──────────┬─────price─┐
│ W1U │ BAKER STREET │ 594300000 │
│ W1J │ STANHOPE ROW │ 569200000 │
│ SE1 │ SUMNER STREET │ 448500000 │
│ E1 │ BRAHAM STREET │ 421364142 │
│ EC2V │ GRESHAM STREET │ 411500000 │
│ SE10 │ WATERVIEW DRIVE │ 400000000 │
│ EC1Y │ MALLOW STREET │ 372600000 │
│ SW1H │ BROADWAY │ 370000000 │
│ W1S │ NEW BOND STREET │ 366180000 │
│ EC4V │ CARTER LANE │ 337000000 │
└───────────┴─────────────────┴───────────┘
10 rows in set. Elapsed: 0.498 sec. Processed 25.32 million rows, 574.02 MB (50.83 million rows/s., 1.15 GB/s.)
Peak memory usage: 60.70 MiB.
上述查询与等效 SQL 相比,简洁性令人信服。
作为一种编译为 SQL 的语言,我们很高兴看到 PRQL 的发展及其在 ClickHouse 中的应用用例。如果您发现 PRQL 有用,并且它帮助您解决了哪些问题,请告诉我们!