Hacker News 数据集
在本教程中,你将把 2800 万行 Hacker News 数据(来自 CSV 和 Parquet 两种格式)插入到一个 ClickHouse 表中,并运行一些简单的查询来探索这些数据。
CSV
数据采样
clickhouse-local 允许用户对本地文件进行快速处理,而无需部署和配置 ClickHouse 服务器。
在将任何数据存储到 ClickHouse 之前,先使用 clickhouse-local 对文件进行采样。 在控制台中运行:
接下来,运行以下命令以浏览数据:
There are a lot of subtle capabilities in this command.
file 操作符允许您从本地磁盘读取文件,只需指定 CSVWithNames 格式即可。
Most importantly, the schema is automatically inferred for you from the file contents.
Note also how clickhouse-local is able to read the compressed file, inferring the gzip format from the extension.
The Vertical format is used to more easily see the data for each column.
使用模式推断加载数据
用于数据加载的最简单且最强大的工具是 clickhouse-client:一个功能丰富的原生命令行客户端。
To load data, you can again exploit schema inference, relying on ClickHouse to determine the types of the columns.
运行以下命令创建表并直接从远程 CSV 文件插入数据,通过 url 函数访问文件内容。
架构会自动推断:
This creates an empty table using the schema inferred from the data.
DESCRIBE TABLE 语句可用于查看这些分配的类型。
要将数据插入此表,请使用 INSERT INTO, SELECT 命令。
配合 url 函数,数据将直接从 URL 流式传输:
您已成功使用单条命令向 ClickHouse 插入了 2800 万行数据!
定义架构
An obvious immediate optimization is to define a type for each field.
除了将时间字段声明为 DateTime 类型外,在删除现有数据集后,我们还需为下列各字段定义相应的类型。
In ClickHouse the primary key id for the data is defined via the ORDER BY clause.
选择合适的数据类型并确定 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 倍的原因。
注意索引如何通过跳过大量数据颗粒来加速查询。
现在还可以高效地搜索单个术语或所有多个术语: