跳到主要内容
跳到主要内容
编辑此页面

在 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 服务器。