Parquet 是一种高效的文件格式,可按列式方式存储数据。
ClickHouse 支持读取和写入 Parquet 文件。
当你在查询中引用文件路径时,ClickHouse 实际尝试读取的位置取决于你使用的是哪种 ClickHouse 版本。如果你使用的是 clickhouse-local,它会从相对于你启动 ClickHouse Local 时所在位置的路径读取。
如果你通过 clickhouse client 使用 ClickHouse Server 或 ClickHouse Cloud,它会从服务器上的 /var/lib/clickhouse/user_files/ 目录下的相对路径读取。
在加载数据之前,我们可以使用 file() 函数查看示例 Parquet 文件的结构:
我们将 Parquet 用作第二个参数,这样 ClickHouse 就能识别文件格式。这将输出带类型的列:
我们还可以在真正导入数据之前,借助 SQL 的强大能力先分析文件:
我们可以省略对 file() 和 INFILE/OUTFILE 的显式格式设置。
在这种情况下,ClickHouse 会根据文件扩展名自动识别格式。
先创建一个用于导入 Parquet 数据的表:
现在可以使用 FROM INFILE 子句导入数据:
请注意,ClickHouse 会自动将 Parquet 字符串 (date 列中的字符串) 转换为 Date 类型。这是因为 ClickHouse 会根据目标表中的类型自动进行类型转换。
如果你想将本地 Parquet 文件插入远程 ClickHouse 服务器,可以像下面这样通过管道将文件内容传给 clickhouse-client:
由于 ClickHouse 会读取 Parquet 文件的 schema,因此我们可以动态创建表:
这会根据给定的 Parquet 文件自动创建并填充一张表:
默认情况下,ClickHouse 会严格校验列名、类型和值。但有时,我们可以在导入时跳过不存在的列或不受支持的值。这可以通过 Parquet 设置 来控制。
在 ClickHouse Cloud 中使用 INTO OUTFILE 时,需要在文件将要写入的那台机器上,通过 clickhouse client 运行这些命令。
要将任意表或查询结果导出为 Parquet 文件,可以使用 INTO OUTFILE 子句:
这会在当前工作目录中创建 export.parquet 文件。
ClickHouse 和 Parquet 数据类型
ClickHouse 和 Parquet 的数据类型大多相同,但仍略有差异。例如,ClickHouse 会将 DateTime 类型导出为 Parquet 的 int64。如果再将其导入回 ClickHouse,我们看到的将是数字 (time.parquet file) :
此时可使用类型转换:
ClickHouse 支持多种格式,包括文本格式和二进制格式,以适应各种场景和平台。你可以在以下文章中进一步了解更多格式及其使用方式:
另外,也可以查看 clickhouse-local——这是一个便携且功能完整的工具,可用于处理本地/远程文件,无需 ClickHouse server。