Apache 发布了多种在分析环境中广泛使用的数据格式,其中包括常见的 Avro、Arrow 和 ORC。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' 1ClickHouse 也可以使用相同的 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 的情况下处理本地/远程文件。