在本教程中,你将把 CSV 和 Parquet 格式的 2800 万行 Hacker News 数据插入 ClickHouse 表中,并运行一些简单查询来探索这些数据。
CSV
1
下载 CSV
2
对数据进行采样
clickhouse-local 可让你快速处理本地文件,而无需
部署和配置 ClickHouse 服务器。在将任何数据存储到 ClickHouse 之前,先使用 clickhouse-local 对文件进行采样。
在终端中运行:Query
Response
file 操作符允许你从本地磁盘读取文件,只需指定 CSVWithNames 格式。
最重要的是,系统会根据文件内容自动为你推断 schema。
还要注意,clickhouse-local 能够读取压缩文件,并根据扩展名推断出 gzip 格式。
这里使用 Vertical 格式,以便更直观地查看每一列的数据。3
通过 schema inference 加载数据
用于加载数据的最简单且最强大的工具是 这会使用从数据中推断出的 schema 创建一个空表。
要将数据插入此表,请使用 你已成功用一条命令将 2800 万行数据插入 ClickHouse!
clickhouse-client:一款功能丰富的原生命令行客户端。
要加载数据,你也可以再次利用 schema inference,由 ClickHouse 自动确定各列的类型。运行以下命令来创建表,并通过 url 函数直接从远程 CSV 文件插入数据。
schema 会自动推断:DESCRIBE TABLE 命令可帮助我们了解这些已分配的类型。Query
Response
INSERT INTO ... SELECT 命令。
结合 url 函数,数据将直接从该 URL 导入:4
查看数据
运行以下查询,对 Hacker News 的新闻条目和特定列进行采样:虽然 schema inference 是初期数据探索的利器,但它只是一种“尽力而为”的方法,不能作为长期方案来替代为您的数据定义最佳 schema。
Query
Response
5
定义 schema
一个显而易见的优化方式,就是为每个字段定义类型。
除了将时间字段声明为 有了优化后的 schema,现在你可以从本地文件系统中插入数据了。
再次使用
DateTime 类型之外,在删除现有数据集后,我们还将为下列每个字段定义合适的类型。
在 ClickHouse 中,数据的主键 id 是通过 ORDER BY 子句定义的。选择合适的类型,并确定在 ORDER BY
子句中包含哪些列,有助于提升查询速度和压缩效果。运行以下查询以删除旧 schema 并创建优化后的 schema:Query
clickhouse-client,通过带有 INFILE 子句的显式 INSERT INTO 语句插入该文件。Query
6
运行示例查询
以下提供了一些示例查询,希望能为您编写自己的查询提供参考。ClickHouse 随时间推移是否产生了更多噪声?这里体现了将 看来 “ClickHouse” 的热度正随着时间的推移持续上升。
“ClickHouse” 在 Hacker News 上是一个多热门的话题?
score 字段提供了衡量故事热度的指标,而id 字段与 ||
拼接运算符可用于生成原始帖子的链接。Query
Response
time 字段定义为 DateTime 的价值所在——使用合适的数据类型,即可调用 toYYYYMM() 函数:Query
Response
谁是 ClickHouse 相关文章中评论最多的用户?
Query
Response
哪些评论最能引发关注?
Query
Response
Parquet
1
插入数据
运行以下查询,使用 运行以下命令查看推断出的 schema:后续步骤将使用更清晰的列名,例如
url 函数再次读取远程数据,并以 Parquet 格式读取相同的数据:Parquet 中的空键推断出的 schema 会将列设为
Nullable,因此即使此数据集不包含
空 ID,仍需启用 allow_nullable_key。Query
Response
author 和 comment,因此请继续使用手动指定的 schema。
首先删除自动推断出的表,然后创建该表,并直接从公网 S3 bucket 插入数据:2
添加文本索引以加快搜索
要查看有多少条评论提到了 “ClickHouse”,请运行以下查询:接下来,在 物化会为现有数据构建索引。结果保持不变,因为索引改变的是 ClickHouse 查找匹配行的方式,而不是决定哪些行匹配。使用索引的
查询处理的数据量显著减少,执行速度也快得多。
使用 当所有标记都必须匹配且顺序不限时,使用
Query
Response
comment 列上创建一个文本索引,
以加快此查询。文本索引使用倒排索引,将标记映射到包含这些标记的行。
splitByNonAlpha 分词器会按非字母数字字符拆分文本。索引和查询均使用 lower(comment),
并采用小写搜索词,因此匹配时不区分大小写。查询表达式必须与索引表达式一致。运行以下命令创建索引:mutations_sync 设置会等待物化完成。
您可以在 system.data_skipping_indices 表中查看索引定义。索引物化完成后,再次运行相同的查询:Query
Response
EXPLAIN 确认 ClickHouse 计划使用该索引:Query
Response
comment_idx 条目表明 ClickHouse 计划使用该文本索引。在此示例中,执行计划从 3527 个
粒度中选取了 547 个,大幅减少了需要扫描的数据量。您还可以搜索多个标记中的任意一个或全部。这些函数匹配由索引分词器生成的完整标记。
当至少有一个标记需要匹配时,请使用 hasAnyTokens:Query
Response
hasAllTokens:Query
Response