跳到主要内容
跳到主要内容

在 ClickHouse 中使用 Parquet

Parquet 是一种高效的文件格式,以列式方式存储数据。 ClickHouse 支持读取和写入 Parquet 文件。

提示

在查询中引用文件路径时,ClickHouse 尝试读取的位置将取决于您使用的 ClickHouse 变种。

如果您正在使用 clickhouse-local,它将从您启动 ClickHouse Local 所在位置的相对路径读取。 如果您通过 clickhouse client 使用 ClickHouse Server 或 ClickHouse Cloud,它将从服务器上 /var/lib/clickhouse/user_files/ 目录的相对路径读取。

从 Parquet 导入数据

在加载数据之前,我们可以使用 file() 函数探索一个 示例 Parquet 文件 的结构:

我们将 Parquet 作为第二个参数使用,因此 ClickHouse 知道文件格式。这将打印出带有类型的列:

我们还可以在实际导入数据之前使用 SQL 的所有功能来探索文件:

提示

我们可以跳过 file()INFILE/OUTFILE 的显式格式设置。 在这种情况下,ClickHouse 将根据文件扩展名自动检测格式。

导入到现有表中

让我们创建一个表,以便将 Parquet 数据导入其中:

现在我们可以使用 FROM INFILE 子句导入数据:

请注意,ClickHouse 自动将 Parquet 字符串(在 date 列中)转换为 Date 类型。这是因为 ClickHouse 会根据目标表中的类型自动进行类型转换。

将本地文件插入到远程服务器

如果您想将本地的 Parquet 文件插入到远程 ClickHouse 服务器,可以通过将文件内容传送到 clickhouse-client 来实现,如下所示:

从 Parquet 文件创建新表

由于 ClickHouse 可以读取 Parquet 文件模式,我们可以即时创建表:

这将从给定的 Parquet 文件自动创建并填充表:

默认情况下,ClickHouse 对列名、类型和数值很严格。但是,有时我们可以在导入过程中跳过不存在的列或不支持的值。这可以通过 Parquet 设置 来管理。

导出为 Parquet 格式

提示

在使用 ClickHouse Cloud 的 INTO OUTFILE 时,您需要在将写入文件的机器上运行 clickhouse client 中的命令。

要将任何表或查询结果导出到 Parquet 文件,可以使用 INTO OUTFILE 子句:

这将在工作目录中创建 export.parquet 文件。

ClickHouse 与 Parquet 数据类型

ClickHouse 与 Parquet 数据类型大致相同,但仍然 有一些差异。例如,ClickHouse 将 DateTime 类型导出为 Parquet 的 int64。如果我们再将其导入到 ClickHouse 中,我们将看到数字(time.parquet 文件):

在这种情况下,可以使用 类型转换

深入阅读

ClickHouse 引入对多种格式的支持,包括文本和二进制,以覆盖各种场景和平台。在以下文章中探索更多格式及其使用方式:

同时也可以查看 clickhouse-local - 一个可移植的全功能工具,无需 ClickHouse 服务器即可处理本地/远程文件。