Parquet格式
更新时间:2025-01-20
Parquet格式
Parquet 是一种高效的文件格式,以列为单位存储数据。ClickHouse 提供对 Parquet 文件的读取和写入支持。
从 Parquet 导入
- 在加载数据之前,我们可以使用file()函数来探索示例 parquet 文件结构:
DESCRIBE TABLE file('data.parquet', Parquet);
- 使用Parquet作为第二个参数,因此 ClickHouse 知道文件格式。这将打印具有以下类型的列:
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
- 还可以在实际导入数据之前利用SQL的所有功能搜索文件:
SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;
┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │
│ Aegithina_tiphia │ 2018-02-01 │ 34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │
└───────────────────────────┴────────────┴──────┘
导入到现有表
- 创建一个表,将 Parquet 数据导入其中:
CREATE TABLE sometable
(
`path` String,
`date` Date,
`hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);
- 使用以下
FROM INFILE
句子导入数据:
INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;
SELECT *
FROM sometable
LIMIT 5;
┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy │ 2015-05-01 │ 70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │
│ 24_hours_of_lemans │ 2015-05-01 │ 37 │
│ 25604_Karlin │ 2015-05-01 │ 20 │
│ ASCII_ART │ 2015-05-01 │ 9 │
└───────────────────────────────┴────────────┴──────┘
请注意ClickHouse如何自动将Parquet字符串(在date
列中)转换为Date
类型。这是因为 ClickHouse 根据目标表中的类型自动进行类型转换。
将本地文件插入到远程服务器
如果要将本地 Parquet 文件插入到远程 ClickHouse 服务器,可以通过将文件内容导入来实现clickhouse-client
,如下所示:
clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet
从Parquet文件创建新表
- 从Parquet文件创建新表:
CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)
- 自动从给定的Parquet文件创建和填充表格:
DESCRIBE TABLE imported_from_parquet;
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
默认情况下,ClickHouse 对列名、类型和值的要求很严格。但有时,我们可以在导入过程中跳过不存在的列或不支持的值。
导出为Parquet格式
- 要将任何表或查询结果导出到Parquet文件,可以使用以下
INTO OUTFILE
句子:
SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT Parquet
ClickHouse和Parquet数据类型
- ClickHouse 和 Parquet 数据类型大部分相同,但仍有一点不同。例如,ClickHouse 将
DateTime
类型导出为 Parquets'int64
。如果将其导入回 ClickHouse,将看到:
SELECT * FROM file('time.parquet', Parquet);
┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘
2.在这种情况下可以使用类型转换:
SELECT
n,
toDateTime(time) <--- int to time
FROM file('time.parquet', Parquet);
┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘