メインコンテンツまでスキップ
メインコンテンツまでスキップ

ClickHouseでAvro、Arrow、ORCデータを扱う

Apacheは、人気のある AvroArrow、および Orc を含む、分析環境で活発に使用される複数のデータフォーマットをリリースしました。ClickHouseは、そのリストから任意のフォーマットを使用してデータのインポートおよびエクスポートをサポートしています。

Avroフォーマットでのインポートとエクスポート

ClickHouseは、Hadoopシステムで広く使用されている Apache Avro データファイルの読み取りと書き込みをサポートしています。

avro file からインポートするには、INSERTステートメントで Avro フォーマットを使用します:

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

data() 関数を使用すると、実際にデータをインポートする前に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ファイルのインポートまたはエクスポートの際には data types matching を考慮してください。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 file からデータをインポートするには、Arrow フォーマットを使用します:

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

Arrowファイルへのエクスポートも同じ方法で行えます:

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

また、手動で変換する必要があるかどうかを知るために data types matching を確認してください。

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 format を使用して Orc data のインポートおよびエクスポートをサポートしています:

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

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

また、エクスポートおよびインポートを調整するために、 data types matching および additional settings を確認してください。

さらなる読み物

ClickHouseは、さまざまなシナリオやプラットフォームをカバーするため、多くのフォーマット(テキストおよびバイナリ)のサポートを導入しています。以下の記事で、より多くのフォーマットやそれらとの作業方法を探求してください:

また、clickhouse-local を確認してください - ClickHouseサーバーなしでローカル/リモートファイルで作業するためのフル機能を持ったポータブルツールです。