--- sidebar_label: Apache Beam slug: /ja/integrations/apache-beam description: Apache Beamを使用したClickHouseへのデータ取り込み --- # Apache BeamとClickHouseの統合 **Apache Beam**は、オープンソースの統合プログラミングモデルで、開発者がバッチおよびストリーム(継続的)データ処理パイプラインの定義と実行を可能にします。Apache Beamの柔軟性は、ETL(抽出、変換、ロード)操作から複雑なイベント処理およびリアルタイム解析まで、幅広いデータ処理シナリオをサポートする能力にあります。この統合は、基盤の挿入レイヤーとしてClickHouseの公式[JDBCコネクタ](https://github.com/ClickHouse/clickhouse-java)を活用します。 ## 統合パッケージ Apache BeamとClickHouseを統合するために必要な統合パッケージは、多くの一般的なデータストレージシステムおよびデータベースの統合バンドル[Apache Beam I/O Connectors](https://beam.apache.org/documentation/io/connectors/)として管理および開発されています。`org.apache.beam.sdk.io.clickhouse.ClickHouseIO`の実装は、[Apache Beamリポジトリ](https://github.com/apache/beam/tree/0bf43078130d7a258a0f1638a921d6d5287ca01e/sdks/java/io/clickhouse/src/main/java/org/apache/beam/sdk/io/clickhouse)にあります。 ## Apache Beam ClickHouseパッケージのセットアップ ### パッケージインストール 以下の依存関係をパッケージ管理フレームワークに追加します: ```xml org.apache.beam beam-sdks-java-io-clickhouse ${beam.version} ``` アーティファクトは[公式マヴンリポジトリ](https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-io-clickhouse)で見つけることができます。 ### コード例 以下の例では、`input.csv`という名前のCSVファイルを`PCollection`として読み込み、定義されたスキーマを使用して行オブジェクトに変換し、`ClickHouseIO`を使用してローカルのClickHouseインスタンスに挿入します: ```java package org.example; import org.apache.beam.sdk.Pipeline; import org.apache.beam.sdk.io.TextIO; import org.apache.beam.sdk.io.clickhouse.ClickHouseIO; import org.apache.beam.sdk.schemas.Schema; import org.apache.beam.sdk.transforms.DoFn; import org.apache.beam.sdk.transforms.ParDo; import org.apache.beam.sdk.values.PCollection; import org.apache.beam.sdk.values.Row; import org.joda.time.DateTime; public class Main { public static void main(String[] args) { // パイプラインオブジェクトの作成 Pipeline p = Pipeline.create(); Schema SCHEMA = Schema.builder() .addField(Schema.Field.of("name", Schema.FieldType.STRING).withNullable(true)) .addField(Schema.Field.of("age", Schema.FieldType.INT16).withNullable(true)) .addField(Schema.Field.of("insertion_time", Schema.FieldType.DATETIME).withNullable(false)) .build(); // パイプラインへの変換の適用 PCollection lines = p.apply("ReadLines", TextIO.read().from("src/main/resources/input.csv")); PCollection rows = lines.apply("ConvertToRow", ParDo.of(new DoFn() { @ProcessElement public void processElement(@Element String line, OutputReceiver out) { String[] values = line.split(","); Row row = Row.withSchema(SCHEMA) .addValues(values[0], Short.parseShort(values[1]), DateTime.now()) .build(); out.output(row); } })).setRowSchema(SCHEMA); rows.apply("Write to ClickHouse", ClickHouseIO.write("jdbc:clickhouse://localhost:8123/default?user=default&password=******", "test_table")); // パイプラインを実行 p.run().waitUntilFinish(); } } ``` ## サポートされているデータタイプ | ClickHouse | Apache Beam | 対応 | 備考 | |--------------------------------------|------------------------------|--------------|----------------------------------------------------------------------------------------------------------------------------------------| | `TableSchema.TypeName.FLOAT32` | `Schema.TypeName#FLOAT` | ✅ | | | `TableSchema.TypeName.FLOAT64` | `Schema.TypeName#DOUBLE` | ✅ | | | `TableSchema.TypeName.INT8` | `Schema.TypeName#BYTE` | ✅ | | | `TableSchema.TypeName.INT16` | `Schema.TypeName#INT16` | ✅ | | | `TableSchema.TypeName.INT32` | `Schema.TypeName#INT32` | ✅ | | | `TableSchema.TypeName.INT64` | `Schema.TypeName#INT64` | ✅ | | | `TableSchema.TypeName.STRING` | `Schema.TypeName#STRING` | ✅ | | | `TableSchema.TypeName.UINT8` | `Schema.TypeName#INT16` | ✅ | | | `TableSchema.TypeName.UINT16` | `Schema.TypeName#INT32` | ✅ | | | `TableSchema.TypeName.UINT32` | `Schema.TypeName#INT64` | ✅ | | | `TableSchema.TypeName.UINT64` | `Schema.TypeName#INT64` | ✅ | | | `TableSchema.TypeName.DATE` | `Schema.TypeName#DATETIME` | ✅ | | | `TableSchema.TypeName.DATETIME` | `Schema.TypeName#DATETIME` | ✅ | | | `TableSchema.TypeName.ARRAY` | `Schema.TypeName#ARRAY` | ✅ | | | `TableSchema.TypeName.ENUM8` | `Schema.TypeName#STRING` | ✅ | | | `TableSchema.TypeName.ENUM16` | `Schema.TypeName#STRING` | ✅ | | | `TableSchema.TypeName.BOOL` | `Schema.TypeName#BOOLEAN` | ✅ | | | `TableSchema.TypeName.TUPLE` | `Schema.TypeName#ROW` | ✅ | | | `TableSchema.TypeName.FIXEDSTRING` | `FixedBytes` | ✅ | `FixedBytes`は、固定長のバイト配列を表すLogicalTypeであり、`org.apache.beam.sdk.schemas.logicaltypes`に位置しています | | | `Schema.TypeName#DECIMAL` | ❌ | | | | `Schema.TypeName#MAP` | ❌ | | ## 制限 コネクタを使用する際には、以下の制限事項を考慮してください: * 現時点では、Sink操作のみがサポートされています。コネクタはSource操作をサポートしていません。 * ClickHouseは、`ReplicatedMergeTree`または`ReplicatedMergeTree`を基に構築された`分散テーブル`に挿入する際にデデュプリケーションを行います。レプリケーションがない場合、通常のMergeTreeに挿入すると、挿入が失敗し、その後再試行に成功すると重複が発生する可能性があります。ただし、各ブロックは原子的に挿入され、ブロックサイズは`ClickHouseIO.Write.withMaxInsertBlockSize(long)`を使用して設定できます。デデュプリケーションは、挿入されたブロックのチェックサムを使用して実現されます。デデュプリケーションに関する詳細は、[Deduplication](https://clickhouse.com/docs/ja/guides/developer/deduplication)および[Deduplicate insertion config](https://clickhouse.com/docs/ja/operations/settings/settings#insert-deduplicate)を参照してください。 * コネクタはDDL文を実行しないため、挿入先のテーブルはあらかじめ存在している必要があります。 ## 関連コンテンツ * `ClickHouseIO`クラスの[ドキュメント](https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/clickhouse/ClickHouseIO.html)。 * `Github`リポジトリの例[clickhouse-beam-connector](https://github.com/ClickHouse/clickhouse-beam-connector)。