Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

在 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 流式传输数据:

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 server 的情况下处理本地/远程文件。

Navigation