简介
在 ClickHouse,我们对基准测试和性能充满热情。因此,当我第一次看到 Hacker News 上的帖子“查询大型 JSON 文件速度最快的工具是用 Python 编写的”时,我的第一个想法是 -“但是 clickhouse-local 不是用 Python 编写的”。让我们看看这个基准测试,并证明 clickhouse-local 实际上是查询大型 JSON 文件速度最快的工具。
clickhouse-local
clickhouse-local 是一个单一的二进制文件,它允许您使用 SQL 对本地和远程文件执行快速处理 - 有效地实现了数据库功能,而无需数据库。除了支持完整的ClickHouse 函数外,JSON 也是众多支持的文件格式之一。下面我们尝试可视化 ClickHouse 集群、单个 ClickHouse 实例和 clickhouse-local 之间的区别。
基准测试
SPySQL 的创建者 Daniel Moura 发布了一个基准测试,作为SPySQL 项目的一部分。该基准测试比较了几个命令行工具,重点是查询适合标准机器磁盘但可能不适合内存的大型文件。10GB 的亚马逊图书评论数据集子集被用作测试数据集。基准测试中最初使用的工具列表包括 SPySQL、jq、trdsql、Miller、OctoSQL、spqrk-sql、Pandas 和 DSQ。基准测试本身侧重于 3 个挑战。
- 映射:为所有行计算一个新列(批处理输入和输出都很大)。这代表了数据清洗和丰富所需的一般 ETL 类任务。
- 聚合/归约:计算某列所有行的平均值(只有输入很大)。对于需要快速分析答案并希望避免将数据加载到 ClickHouse 等数据存储中的步骤的用户很有用。
- 子集/筛选:返回与筛选条件匹配的列的前 100 个值(只需要处理部分输入)。此测试的目的是评估工具快速采样文件的能力,并代表用户在迭代查询之前经常执行的任务。
此基准测试的第一组结果显示 SPySQL 是查询大型 JSON 文件速度最快的工具。
但 Daniel 并不知道 clickhouse-local。为了协助这项任务,ClickHouse 最近引入了两个很酷的功能,使处理 JSON 文件并重现此基准测试变得简单直接:支持半结构化数据存储和自动模式推断。后者功能允许 ClickHouse 从数据本身推断列的类型,因此用户无需指定 JSON 文件的结构和每个字段的类型:简化语法并加快入门体验。
在联系 Daniel 后,他立即将 clickhouse-local 添加到他的基准测试中并更新了结果。令他惊讶的是,clickhouse-local 比所有以前的工具都快。OctoSQL(用 Go 编写)的开发人员之一也要求根据最新改进更新基准测试,并取得了良好的效果。下面我们展示更新后的基准测试结果。
映射挑战
1GB 数据的结果
聚合(归约)挑战
1GB 数据的结果
筛选(子集)挑战
1GB 数据的结果
结果汇总
更新后的结果已发布此处。正如我们所看到的,clickhouse-local 在查询大型 JSON 文件方面比大多数其他工具快得多,而 OctoSQL 在较小的文件上表现出色。
此基准测试并不完美。每个查询只运行一次,因此可能存在波动,并且在本地硬件上重现结果的用户可能会在运行之间体验到明显的差异。由于硬件和操作系统差异,结果也可能有所不同。最后,Daniel 故意不使用筛选查询中的 ORDER BY 子句。虽然这可能意味着工具之间的结果不同,因为 SQL 不会强制执行默认顺序,但基准测试的目标是用户希望尽快采样文件以及工具避免完整扫描的能力。此测试有利于支持在满足 LIMIT 后提前终止的工具,以及不需要将整个文件加载到内存中的工具。
因此,下次您需要处理大型 JSON 文件时,您就知道该使用哪个工具了!