又一个月过去了。当然,这意味着又一个 ClickHouse 版本发布了!
22.11 版本发布了!
像往常一样,我们每月都会举办一个版本发布网络研讨会,Alexey 会详细介绍该版本,赠送一些礼品,并留出时间回答社区问题。别忘了注册参加 22.12 版本的网络研讨会。
如果您有兴趣探索这些功能,22.11 版本已在 ClickHouse Cloud 上提供,这是探索新功能的最佳方式!让我们为您运行 ClickHouse,以便您可以专注于您的应用程序。
版本摘要
15 个新功能。5 项性能优化。32 个错误修复。
如果这还不够让您感兴趣去尝试它。查看一些主要内容
- 复合时间间隔
- 支持 ** Glob
- 用于 Spark 兼容性的函数
- INSERT 重试
- 通过 Apache Hudi 和 Delta Lake 支持数据湖以进行 SELECT 查询
当然,还有许多性能改进和集成工作。包括 Python 客户端的实质性更改以及 Go 和 JS 客户端的更新
有用链接
重试将节省您的精力
任何将大量数据迁移到 ClickHouse 的人都应该对 INSERT 中添加的重试功能感到兴奋。在此功能添加之前,大型插入很容易被打断并可能由于与 ClickHouse keeper/Zookeeper 的连接问题而失败,例如由于资源压力或网络中断。INSERT 中单个失败的块将导致整个请求失败。对于长时间运行的插入,例如使用 remoteSecure 进行的数据迁移,这可能会非常令人沮丧,用户需要重置其状态。我们现在添加了设置 insert_keeper_max_retries
,它允许插入在重新连接到 keeper 和潜在的重启后继续进行。如果块现在在 INSERT 期间失败,它现在将被重试。如果成功,INSERT 将照常进行。值为 5 应该足够并涵盖大多数用例。
深入探讨 ** Glob
有时,我们会添加一个功能,而我们的用户却惊讶地发现它之前还没有得到支持。本月带来了这样一个功能:使用 Glob 模式进行递归遍历。我们现在在任何接受路径的表函数中公开此功能。我们的大多数用户会发现这在从本地存储或 s3 存储桶读取数据时特别有用,以便对文件执行临时分析或选择性地将数据插入到您的 ClickHouse 实例中。
让我们举一个例子来演示这如何有用。我们最近 发布了一篇博文 展示了与 ClickHouse 一起分发的 git-import
工具,它允许您为存储库编制索引提交历史记录 - 请参阅 此处 以了解生成的表的描述。我们为 ClickHouse 和 Linux 存储库在 s3 存储桶中免费分发这些数据,每个存储库一个文件夹,文件根据其最新年份和月份命名。我们还为每个表维护一个单独的文件。我们也可能随着时间的推移在此处添加其他开源存储库。
clickhouse@my-mac ~ % aws s3 ls s3://datasets-documentation/github/commits/ PRE clickhouse/ PRE linux/ clickhouse@my-mac ~ % aws s3 ls s3://datasets-documentation/github/commits/clickhouse/ 2022-11-09 15:16:26 0 2022-11-30 11:53:43 2625584 commits.tsv.xz 2022-11-30 12:06:57 1020 commits_200812.tsv.xz 2022-11-30 12:06:57 268 commits_200901.tsv.xz … 2022-11-30 11:53:54 4755844 file_changes.tsv.xz 2022-11-30 12:06:59 1304 file_changes_200812.tsv.xz 2022-11-30 12:06:59 300 file_changes_200901.tsv.xz … 2022-11-30 11:57:40 135037052 line_changes.tsv.xz 2022-11-30 12:07:01 28396 line_changes_200812.tsv.xz 2022-11-30 12:07:01 472 line_changes_200901.tsv.xz …
维护分层和文件命名策略的好处不仅仅是帮助导航。作为 ClickHouse 用户,它允许您使用 s3 函数定位特定数据子集,从而减少需要读取以回答查询的数据量。Glob 模式现在增强了此功能!
随着 Glob 模式的添加,我们现在除了现有的支持外,还支持使用 **
模式递归目录
- 扩展模式,例如
{1..10}
- 集合匹配,例如
{commits, file-changes}
让我们使用上述数据演示其中一些功能
按存储库计算提交次数 - 请注意 **
以递归并仅使用提交文件,以及虚拟 _path
列。
SELECT splitByChar('/', _path)[-2] AS repository, count() AS `number of commits` FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/**/commits.tsv.xz', 'TSV') GROUP BY _path ┌─repository─┬─number of commits─┐ │ clickhouse │ 62785 │ │ linux │ 1046773 │ └────────────┴───────────────────┘ 2 rows in set. Elapsed: 6.717 sec. Processed 1.11 million rows, 250.11 MB (165.18 thousand rows/s., 37.23 MB/s.)
如果我们计算 2022 年前 6 个月的提交次数会怎么样?我们可以应用 WHERE 子句并按时间过滤。这意味着读取所有数据,这将很慢 - 我们把它留给读者去尝试!但是,使用 glob 模式,我们只读取我们需要的内容……
SELECT splitByChar('/', _path)[-2] AS repository, month, count() AS `number of commits` FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/**/commits_2022{01..06}.tsv.xz', 'TSV', 'hash String,author LowCardinality(String), time DateTime, message String, files_added UInt32, files_deleted UInt32, files_renamed UInt32, files_modified UInt32, lines_added UInt32, lines_deleted UInt32, hunks_added UInt32, hunks_removed UInt32, hunks_changed UInt32') GROUP BY _path, toStartOfMonth(time) AS month ORDER BY repository ASC, month ASC ┌─repository─┬──────month─┬─number of commits─┐ │ clickhouse │ 2022-01-01 │ 1085 │ │ clickhouse │ 2022-02-01 │ 802 │ │ clickhouse │ 2022-03-01 │ 1099 │ │ clickhouse │ 2022-04-01 │ 1188 │ │ clickhouse │ 2022-05-01 │ 1541 │ │ clickhouse │ 2022-06-01 │ 1243 │ │ linux │ 2022-01-01 │ 5374 │ │ linux │ 2022-02-01 │ 6768 │ │ linux │ 2022-03-01 │ 5919 │ │ linux │ 2022-04-01 │ 7232 │ │ linux │ 2022-05-01 │ 7105 │ │ linux │ 2022-06-01 │ 6404 │ └────────────┴────────────┴───────────────────┘ 12 rows in set. Elapsed: 3.501 sec. Processed 32.25 thousand rows, 4.95 MB (9.21 thousand rows/s., 1.41 MB/s.)
最后,让我们使用新的集合功能通过集合过滤器限制到 Clickhouse 和 Linux 提交,并查看是否有任何内核提交者也为 ClickHouse 做出了贡献(我们也使用了一些数组函数以供娱乐 :) - 是的,还有更多自然的方法来解决!)。…
WITH commits AS ( SELECT repository, author FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/{linux,clickhouse}/commits_*.tsv.xz', 'TSV', 'hash String,author LowCardinality(String), time DateTime, message String, files_added UInt32, files_deleted UInt32, files_renamed UInt32, files_modified UInt32, lines_added UInt32, lines_deleted UInt32, hunks_added UInt32, hunks_removed UInt32, hunks_changed UInt32') GROUP BY splitByChar('/', _path)[-2] AS repository, author ), authors AS ( SELECT groupArrayIf(author, repository = 'linux') AS linux_authors, groupArrayIf(author, repository = 'clickhouse') AS clickhouse_authors FROM commits ) SELECT arrayJoin(arrayIntersect(linux_authors, clickhouse_authors)) AS common_authors FROM authors ┌─common_authors──────┐ │ root │ │ Hui Wang │ │ Dmitry │ │ Matwey V. Kornilov │ │ Salvatore Mesoraca │ │ Ivan Babrou │ │ Robert Schulze │ │ Sergey Kononenko │ │ Anatoly Pugachev │ │ Azat Khuzhin │ │ Ken Chen │ │ Maxim Nikulin │ │ Gabriel │ │ Quanfa Fu │ │ Rafael David Tinoco │ │ Ben │ │ Vladimir │ │ Jiebin Sun │ │ George │ │ Yong Wang │ │ Dmitry Bilunov │ │ Ilya │ └─────────────────────┘
此处的结果有点棘手,因为作者字段(贡献者姓名)不是唯一识别个人的好方法,但我们感谢社区中真正获得此殊荣的成员。
随时使用 s3 函数和 glob 模式回答 此处 列出的任何问题。