在 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
时需要在要写入文件的机器上运行命令。
要将任何表或查询结果导出到 Parquet 文件,可以使用 INTO OUTFILE
子句:
这将在工作目录中创建 export.parquet
文件。
ClickHouse 和 Parquet 数据类型
ClickHouse 和 Parquet 数据类型大致相同,但仍然 略有不同。例如,ClickHouse 将 DateTime
类型导出为 Parquet 的 int64
。如果我们将其再导入到 ClickHouse,我们将看到数字(time.parquet 文件):
在这种情况下,可以使用 类型转换 :
深入阅读
ClickHouse 支持多种格式,包括文本和二进制,以覆盖各种场景和平台。可以在以下文章中探索更多格式及其使用方法:
还可以查看 clickhouse-local - 一个便携式的全功能工具,用于在不需要 Clickhouse 服务器的情况下处理本地/远程文件。