跳至主要内容

在 ClickHouse 中使用 Avro、Arrow 和 ORC 数据

Apache 发布了多种在分析环境中积极使用的常用数据格式,包括流行的 AvroArrowOrc。ClickHouse 支持使用列表中的任何格式导入和导出数据。

以 Avro 格式导入和导出

ClickHouse 支持读取和写入 Apache Avro 数据文件,这些文件广泛用于 Hadoop 系统。

要从 avro 文件 导入,我们应该在 INSERT 语句中使用 Avro 格式

INSERT INTO sometable
FROM INFILE 'data.avro'
FORMAT Avro

使用 file() 函数,我们也可以在实际导入数据之前探索 Avro 文件

SELECT path, hits
FROM file('data.avro', Avro)
ORDER BY hits DESC
LIMIT 5;
┌─path────────────┬──hits─┐
│ Amy_Poehler │ 62732 │
│ Adam_Goldberg │ 42338 │
│ Aaron_Spelling │ 25128 │
│ Absence_seizure │ 18152 │
│ Ammon_Bundy │ 11890 │
└─────────────────┴───────┘

要导出到 Avro 文件

SELECT * FROM sometable
INTO OUTFILE 'export.avro'
FORMAT Avro;

Avro 和 ClickHouse 数据类型

在导入或导出 Avro 文件时,请考虑 数据类型匹配。从 Avro 文件加载数据时,使用显式类型转换进行转换

SELECT
date,
toDate(date)
FROM file('data.avro', Avro)
LIMIT 3;
┌──date─┬─toDate(date)─┐
│ 16556 │ 2015-05-01 │
│ 16556 │ 2015-05-01 │
│ 16556 │ 2015-05-01 │
└───────┴──────────────┘

Kafka 中的 Avro 消息

当 Kafka 消息使用 Avro 格式时,ClickHouse 可以使用 AvroConfluent 格式和 Kafka 引擎读取此类流

CREATE TABLE some_topic_stream
(
field1 UInt32,
field2 String
)
ENGINE = Kafka() SETTINGS
kafka_broker_list = 'localhost',
kafka_topic_list = 'some_topic',
kafka_group_name = 'some_group',
kafka_format = 'AvroConfluent';

使用 Arrow 格式

另一种列式格式是 Apache Arrow,ClickHouse 也支持导入和导出。要从 Arrow 文件 导入数据,我们使用 Arrow 格式

INSERT INTO sometable
FROM INFILE 'data.arrow'
FORMAT Arrow

导出到 Arrow 文件的方式相同

SELECT * FROM sometable
INTO OUTFILE 'export.arrow'
FORMAT Arrow

此外,请查看 数据类型匹配 以了解是否需要手动转换任何内容。

Arrow 数据流

ArrowStream 格式可用于处理 Arrow 流(用于内存处理)。ClickHouse 可以读取和写入 Arrow 流。

为了演示 ClickHouse 如何流式传输 Arrow 数据,让我们将其传递到以下 Python 脚本(它以 Arrow 流格式读取输入流并将结果输出为 Pandas 表格)

import sys, pyarrow as pa

with pa.ipc.open_stream(sys.stdin.buffer) as reader:
print(reader.read_pandas())

现在我们可以通过将其输出传递到脚本中来从 ClickHouse 流式传输数据

clickhouse-client -q "SELECT path, hits FROM some_data LIMIT 3 FORMAT ArrowStream" | python3 arrow.py
                           path  hits
0 b'Akiba_Hebrew_Academy' 241
1 b'Aegithina_tiphia' 34
2 b'1971-72_Utah_Stars_season' 1

ClickHouse 也可以使用相同的 ArrowStream 格式读取 Arrow 流

arrow-stream | clickhouse-client -q "INSERT INTO sometable FORMAT ArrowStream"

我们已使用 arrow-stream 作为 Arrow 流数据可能的来源。

导入和导出 ORC 数据

Apache ORC 格式是一种通常用于 Hadoop 的列式存储格式。ClickHouse 支持导入和导出 Orc 数据,使用 ORC 格式

SELECT *
FROM sometable
INTO OUTFILE 'data.orc'
FORMAT ORC;

INSERT INTO sometable
FROM INFILE 'data.orc'
FORMAT ORC;

此外,请查看 数据类型匹配 以及 其他设置 以调整导出和导入。

进一步阅读

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

还可以查看 clickhouse-local - 一种便携式功能齐全的工具,无需 Clickhouse 服务器即可处理本地/远程文件。