发布列车继续前进。
我们非常高兴地分享 23.7 版本中的一系列惊人功能
并且,我们已经确定了 23.8 版本的发布日期,请立即注册,加入 8 月 31 日上午 9:00(太平洋时间)/ 下午 6:00(中欧夏令时)的社区电话会议。
版本摘要
31 个新功能。
16 个性能优化。
47 个错误修复。
以下列出了一些重点功能,但值得注意的是,许多功能现在已可投入生产,或已默认启用。您可以在本文末尾找到这些功能。
新贡献者
向所有为 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,并取得了不同程度的成功。新的查询语言不断涌现,但通常很快就会消失。SQL 的持久性和它在历代数据存储系统中的整合证明了它的持久重要性。然而,我们也认识到在熟悉的领域与用户互动的重要性,并认识到某些语言比其他语言更适合用例。如果我们看到足够多的采用和对一种查询语言的需求,我们可以考虑添加支持并始终欢迎社区 PR!感谢这样的社区贡献,PRQL 现在已作为实验性功能在 ClickHouse 中得到支持。
PRQL(流水线关系查询语言)读作“前传”,将自己定位为“一个简单、强大、流水线的 SQL 替代品”。语法的流水线性质已被证明很受欢迎,并拥有不断增长的贡献者社区。通过将转换链接起来形成管道,否则复杂的 SQL 查询可以优雅地组合起来。在 ClickHouse,我们可以看到这种查询构建风格在某些情况下可能具有有趣的应用,特别是在用户进行搜索和发现操作的用例中 - 可观察性或许?
除了有据可循之外,用户还可以使用公共游乐场进行实验。让我们考虑一些使用英国房价数据集的简单示例。假设希望在伦敦找到最高价的地区
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 有用以及它所解决的问题!