Hacker News 数据集
在本教程中,你将把 2800 万行 Hacker News 数据(来自 CSV 和 Parquet 两种格式)插入到一个 ClickHouse 表中,并运行一些简单的查询来探索这些数据。
CSV
数据采样
clickhouse-local 允许用户对本地文件进行快速处理,而无需部署和配置 ClickHouse 服务器。
在将任何数据存储到 ClickHouse 之前,先使用 clickhouse-local 对文件进行采样。 在控制台中运行:
接下来,运行以下命令以浏览数据:
该命令包含许多强大的功能。
file 操作符允许您从本地磁盘读取文件,只需指定 CSVWithNames 格式即可。
最重要的是,系统会根据文件内容自动推断数据模式。
另外请注意,clickhouse-local 能够读取压缩文件,并根据扩展名自动识别 gzip 格式。
使用 Vertical 格式可以更方便地查看每列的数据。
使用架构推断加载数据
用于数据加载的最简单且最强大的工具是 clickhouse-client:一个功能丰富的原生命令行客户端。
加载数据时,您可以再次利用模式推断功能,由 ClickHouse 自动确定列的类型。
运行以下命令创建表并直接从远程 CSV 文件插入数据,通过 url 函数访问文件内容。
架构会自动推断:
这将根据从数据中推断出的模式创建一个空表。
使用 DESCRIBE TABLE 命令可以查看这些分配的类型。
要将数据插入此表,请使用 INSERT INTO, SELECT 命令。
配合 url 函数,数据将直接从 URL 流式传输:
您已成功使用单条命令向 ClickHouse 插入了 2800 万行数据!
定义架构
一个显而易见的优化方法是为每个字段定义类型。
除了将时间字段声明为 DateTime 类型外,在删除现有数据集后,我们还需为下列各字段定义相应的类型。
在 ClickHouse 中,数据的主键通过 ORDER BY 子句定义。
选择合适的数据类型并确定 ORDER BY 子句中应包含哪些列,有助于提升查询速度和压缩率。
运行以下查询以删除旧模式并创建改进的模式:
优化模式后,现在可以从本地文件系统插入数据。
继续使用 clickhouse-client,通过 INFILE 子句配合显式 INSERT INTO 语句插入文件。
Parquet
ClickHouse 的优势之一是它能够处理任意数量的格式。 CSV 是一个相当理想的用例,但在数据交换方面并不是最高效的。
接下来,将从一个 Parquet 文件中加载数据,它是一种高效的列式格式。
Parquet 仅支持少量数据类型,ClickHouse 需要遵循这些类型,而这些类型信息被编码在格式本身中。 对 Parquet 文件进行类型推断通常会得到一个与 CSV 文件所使用的表结构(schema)略有不同的结果。
插入数据
运行以下查询以 Parquet 格式读取相同的数据,再次使用 url 函数读取远程数据:
由于 Parquet 格式的条件限制,我们必须接受键可能为 NULL,
即使数据中实际上并不包含空值。
运行以下命令查看推断的架构:
与之前处理 CSV 文件时一样,您可以手动指定模式以更精确地控制所选类型,并直接从 S3 插入数据:
添加跳跃索引以加速查询
要查找提到"ClickHouse"的评论数量,请运行以下查询:
接下来,您将在 "comment" 列上创建一个倒排索引,以加快查询速度。 请注意,评论内容将以小写形式建立索引,从而实现不区分大小写的词条查找。
运行以下命令以创建索引:
索引的物化需要一段时间(若要检查索引是否已创建,请使用系统表 system.data_skipping_indices)。
索引创建完成后,再次运行查询:
注意查询在使用索引后仅需 0.248 秒,相比之前未使用索引时的 0.843 秒有显著提升:
可以使用 EXPLAIN 子句来了解添加此索引后查询性能提升约 3.4 倍的原因。
注意索引如何通过跳过大量数据颗粒来加速查询。
现在还可以高效地搜索单个术语或所有多个术语: