这是我们一系列文章中的第一篇,我们将重点介绍一些很酷的查询,并分享一些与 ClickHouse 相关的有趣技巧和窍门。在最初的几篇文章中,我们将重点关注使用 ClickHouse 附带的 git-import
工具对 ClickHouse 存储库进行分析。
简介
在这篇文章中,我们想向我们的社区提供一些见解。 Github 归档 数据集一直是示例和演示的基础。虽然这是一个很好的资源,但它并没有跟踪代码级别的存储库详细信息,例如提交和代码行更改,而是专注于问题、星标、PR 和事件。同时,Git insights(通过 pulse)很有趣,但并不完整……探索 ClickHouse 则更加有趣。
幸运的是,ClickHouse 附带了一个工具可以解决这个问题:git-import
工具。
ClickHouse % clickhouse-git-import -h A tool to extract information from Git repository for analytics. It dumps the data for the following tables: - commits - commits with statistics; - file_changes - files changed in every commit with the info about the change and statistics; - line_changes - every changed line in every changed file in every commit with full info about the line and the information about previous change of this line. The largest and the most important table is "line_changes". Run this tool inside your git repository. It will create .tsv files that can be loaded into ClickHouse (or into other DBMS if you dare).
对于 ClickHouse 存储库,截至 2022 年 11 月 8 日,该工具可在几分钟内生成以下大小的文件
commits.tsv
- 7.8M - 266,051 行file_changes.tsv
- 53M - 266,051 行line_changes.tsv
- 2.7G - 7,535,157 行
您可以为 Github 上的任何存储库生成此数据(请参阅 linux 此处),并使用以下问题作为灵感来分析您自己的项目。如果您没有时间自己生成数据,我们已将自己的数据加载到 play.clickhouse.com(请注意,数据库为 git_clickhouse
),以便我们的社区可以试用示例查询。
已解答的问题
该工具方便地提出了一些您可以解答的可能问题。除了其他一些我们感兴趣的问题外,我们还回答了这些问题,这些问题针对 ClickHouse 存储库。您可以在 此处找到完整的问题列表及其当前答案。请分享您对 ClickHouse 和其他存储库的见解,并随时贡献查询和改进!
请注意,一些问题范围很广,并且可以有多种解释,因此我们欢迎其他答案。这些数据也适用于高级分析目的。由于一些原因(例如,提交历史记录混乱和损坏),它可能不精确,这使得一些更精确的查询特别具有挑战性。但是,这不会影响任何高级分析。
在未来的文章中,我们将深入探讨一些特定的查询,并重点介绍 ClickHouse 的一系列功能。目前,我们想提供一个机会,让您解决工具建议的问题之一,对于这个问题,当前的答案感觉可以改进……
一项挑战
该工具提出的最具挑战性的查询可能是 git blame
命令的重构。提醒一下,git blame
显示当前文件,并使用上次修改该行的修订版的信息注释给定文件中的每一行。例如,
ClickHouse % git blame src/Storages/StorageReplicatedMergeTree.cpp | head Blaming lines: 100% (8630/8630), done. cdeda4ab915 src/Storages/StorageReplicatedMergeTree.cpp (Alexey Milovidov 2020-04-15 23:28:05 +0300 1) #include cdeda4ab915 src/Storages/StorageReplicatedMergeTree.cpp (Alexey Milovidov 2020-04-15 23:28:05 +0300 2) b40d9200d20 src/Storages/StorageReplicatedMergeTree.cpp (Anton Popov 2022-10-23 03:29:26 +0000 3) #include 210882b9c4d src/Storages/StorageReplicatedMergeTree.cpp (alesapin 2022-10-03 23:30:50 +0200 4) #include 4c391f8e994 src/Storages/StorageReplicatedMergeTree.cpp (Mike Kot 2021-06-20 11:24:43 +0300 5) #include "Common/hex.h" a6ca9f266f1 dbms/src/Storages/StorageReplicatedMergeTree.cpp (Alexey Milovidov 2019-05-03 05:00:57 +0300 6) #include a6ca9f266f1 dbms/src/Storages/StorageReplicatedMergeTree.cpp (Alexey Milovidov 2019-05-03 05:00:57 +0300 7) #include 3e5ef56644b dbms/src/Storages/StorageReplicatedMergeTree.cpp (Alexander Burmak 2019-11-27 12:39:44 +0300 8) #include 3e5ef56644b dbms/src/Storages/StorageReplicatedMergeTree.cpp (Alexander Burmak 2019-11-27 12:39:44 +0300 9) #include 3e5ef56644b dbms/src/Storages/StorageReplicatedMergeTree.cpp (Alexander Burmak 2019-11-27 12:39:44 +0300 10) #include
从提交历史记录中重构这一点尤其具有挑战性——特别是因为 ClickHouse 目前没有 arrayFold
或 arrayReduce
函数,这些函数会迭代当前状态。我们的文档提供了一个 近似解决方案,适用于高级分析,但我们希望您能够改进它。
我们将此留给读者解决——第一个给出答案的人将获得一件 T 恤——在 Twitter 上关注 @ClickHouse,或发送电子邮件至 [email protected],主题为“git blame solution”,或者直接在 文档页面上提交 PR。
一些提示
- 在将您的查询结果与
git-blame
进行比较时,请确保检出与生成此数据集相关的同一提交——如果使用 play,请检查最新的提交 此处。这与 此处提供的分布式数据集相同。 - 此外,请考虑文件可以重命名,因此更改可以记录在不同的路径下。我们已经为您解决了这个问题,使用了一个 UDF,它为您提供了完整的更改历史记录。请参阅 此处。
line_changes
表包含每一行更改的行——请参阅line
字段,以及时间和提交。sign
字段指示行是插入 (1) 还是删除 (-1)。- 插入和删除一行会导致所有先前行的位置(在该时刻的行中)分别更改 1 或 -1。
由于提交历史记录中的问题,对于所有文件来说,完全准确的答案不太可能。因此,我们将接受一个接近的答案,并附上归因于数据的差异的理由。如果在 12 月 14 日之前未提交精确的解决方案,则最接近的和当前接受的解决方案将获胜。
对于那些想要参与的人,ClickHouse Cloud 是解决挑战的一个很好的起点——启动一个集群,加载数据,让我们处理基础设施,然后开始查询!
结论
在这篇文章中,我们介绍了 git-import
工具,并提出了一项供我们的社区解决的查询,并提供了一件 T 恤作为奖励!我们鼓励读者浏览完整的问题列表和当前答案,并希望我们的社区能从这些数据中获得价值。在未来的文章中,我们将深入探讨一些具体的查询。