DoubleCloud 即将停止服务。迁移到 ClickHouse,并享受限时免费迁移服务。立即联系我们 ->->

博客 / 工程

查询 JSON 文件速度最快的工具

author avatar
Pavel Kruglov
2022年10月14日

racing-cars.jpg

简介

在 ClickHouse,我们对基准测试和性能充满热情。因此,当我第一次看到 Hacker News 上的帖子“查询大型 JSON 文件速度最快的工具是用 Python 编写的”时,我的第一个想法是 -“但是 clickhouse-local 不是用 Python 编写的”。让我们看看这个基准测试,并证明 clickhouse-local 实际上是查询大型 JSON 文件速度最快的工具。

clickhouse-local

clickhouse-local 是一个单一的二进制文件,它允许您使用 SQL 对本地和远程文件执行快速处理 - 有效地实现了数据库功能,而无需数据库。除了支持完整的ClickHouse 函数外,JSON 也是众多支持的文件格式之一。下面我们尝试可视化 ClickHouse 集群、单个 ClickHouse 实例和 clickhouse-local 之间的区别。

clickhouse-local.png

基准测试

SPySQL 的创建者 Daniel Moura 发布了一个基准测试,作为SPySQL 项目的一部分。该基准测试比较了几个命令行工具,重点是查询适合标准机器磁盘但可能不适合内存的大型文件。10GB 的亚马逊图书评论数据集子集被用作测试数据集。基准测试中最初使用的工具列表包括 SPySQL、jq、trdsql、Miller、OctoSQL、spqrk-sql、Pandas 和 DSQ。基准测试本身侧重于 3 个挑战。

  • 映射:为所有行计算一个新列(批处理输入和输出都很大)。这代表了数据清洗和丰富所需的一般 ETL 类任务。
  • 聚合/归约:计算某列所有行的平均值(只有输入很大)。对于需要快速分析答案并希望避免将数据加载到 ClickHouse 等数据存储中的步骤的用户很有用。
  • 子集/筛选:返回与筛选条件匹配的列的前 100 个值(只需要处理部分输入)。此测试的目的是评估工具快速采样文件的能力,并代表用户在迭代查询之前经常执行的任务。

此基准测试的第一组结果显示 SPySQL 是查询大型 JSON 文件速度最快的工具。

initial_results.png

但 Daniel 并不知道 clickhouse-local。为了协助这项任务,ClickHouse 最近引入了两个很酷的功能,使处理 JSON 文件并重现此基准测试变得简单直接:支持半结构化数据存储和自动模式推断。后者功能允许 ClickHouse 从数据本身推断列的类型,因此用户无需指定 JSON 文件的结构和每个字段的类型:简化语法并加快入门体验。

在联系 Daniel 后,他立即将 clickhouse-local 添加到他的基准测试中并更新了结果。令他惊讶的是,clickhouse-local 比所有以前的工具都快。OctoSQL(用 Go 编写)的开发人员之一也要求根据最新改进更新基准测试,并取得了良好的效果。下面我们展示更新后的基准测试结果。

映射挑战

map.png

1GB 数据的结果

map-results.png

聚合(归约)挑战

reduce.png

1GB 数据的结果

reduce-results.png

筛选(子集)挑战

subset.png

1GB 数据的结果

subset-results.png

结果汇总

results.png

更新后的结果已发布此处。正如我们所看到的,clickhouse-local 在查询大型 JSON 文件方面比大多数其他工具快得多,而 OctoSQL 在较小的文件上表现出色。

此基准测试并不完美。每个查询只运行一次,因此可能存在波动,并且在本地硬件上重现结果的用户可能会在运行之间体验到明显的差异。由于硬件和操作系统差异,结果也可能有所不同。最后,Daniel 故意不使用筛选查询中的 ORDER BY 子句。虽然这可能意味着工具之间的结果不同,因为 SQL 不会强制执行默认顺序,但基准测试的目标是用户希望尽快采样文件以及工具避免完整扫描的能力。此测试有利于支持在满足 LIMIT 后提前终止的工具,以及不需要将整个文件加载到内存中的工具。

因此,下次您需要处理大型 JSON 文件时,您就知道该使用哪个工具了!

分享此帖子

订阅我们的时事通讯

随时了解功能发布、产品路线图、支持和云产品信息!
正在加载表单...
关注我们
Twitter imageSlack imageGitHub image
Telegram imageMeetup imageRss image