メインコンテンツへスキップ
このガイドは、ClickHouse Cloud およびセルフホストの ClickHouse v23.5+ に対応しています。 このガイドでは、BigQuery から ClickHouse へデータを移行する方法を説明します。 まず、テーブルを Google のオブジェクトストレージ (GCS) にエクスポートし、その後そのデータを ClickHouse Cloud にインポートします。BigQuery から ClickHouse に移行する各テーブルについて、この手順を繰り返す必要があります。

ClickHouse へのデータのエクスポートにはどれくらい時間がかかりますか?

BigQuery から ClickHouse へのデータのエクスポートにかかる時間は、データセットのサイズによって異なります。目安として、このガイドを使用して BigQuery から ClickHouse に 4TB の一般公開 Ethereum データセット をエクスポートする場合、約 1 時間かかります。
テーブル行数エクスポートされたファイル数データサイズBigQuery エクスポートスロット使用時間ClickHouse へのインポート
blocks16,569,4897314.53GB23 secs37 min15.4 secs
transactions1,864,514,4145169957GB1 min 38 sec1 day 8hrs18 mins 5 secs
traces6,325,819,30617,9852.896TB5 min 46 sec5 days 19 hr34 mins 55 secs
contracts57,225,83735045.35GB16 sec1 hr 51 min39.4 secs
合計8.26 billion23,5773.982TB8 min 3 sec> 6 days 5 hrs53 mins 45 secs
1

テーブルデータを GCS バケットにエクスポートする

このステップでは、BigQuery SQL ワークスペースを使用して SQL コマンドを実行します。以下では、EXPORT DATAステートメントを使用して、mytable という名前の BigQuery テーブルを GCS バケットにエクスポートします。
DECLARE export_path STRING;
DECLARE n INT64;
DECLARE i INT64;
SET i = 0;

-- n は x 十億行に対応する値に設定することを推奨します。例: 50 億行の場合、n = 5
SET n = 100;

WHILE i < n DO
  SET export_path = CONCAT('gs://mybucket/mytable/', i,'-*.parquet');
  EXPORT DATA
    OPTIONS (
      uri = export_path,
      format = 'PARQUET',
      overwrite = true
    )
  AS (
    SELECT * FROM mytable WHERE export_id = i
  );
  SET i = i + 1;
END WHILE;
上記のクエリでは、BigQuery のテーブルを Parquet data format にエクスポートしています。また、uri パラメータには * 文字が含まれています。これにより、エクスポートするデータが 1GB を超える場合、出力は連番の接尾辞が付いた複数のファイルに分割されます。このアプローチには、いくつかの利点があります。
  • Google では、GCS へのエクスポートを 1 日あたり最大 50TB まで無料で行えます。ユーザーが支払うのは GCS のストレージ料金のみです。
  • エクスポート時には複数のファイルが自動的に生成され、各ファイルは最大 1GB のテーブルデータに制限されます。これによりインポートを並列化できるため、ClickHouse にとって有利です。
  • Parquet はカラム指向のフォーマットであり、本質的に圧縮されているため、BigQuery からのエクスポートも ClickHouse でのクエリも高速です。そのため、データ交換フォーマットとしてより適しています
2

GCS から ClickHouse へのデータのインポート

エクスポートが完了したら、このデータを ClickHouse のテーブルにインポートできます。以下のコマンドは、ClickHouse SQL コンソール または clickhouse-client で実行できます。まず、ClickHouse でテーブルを作成する必要があります。
-- BigQueryのテーブルにSTRUCT型のカラムが含まれている場合、このsettingを有効にする必要があります
-- そのカラムをClickHouseのNested型のカラムにマッピングするために必要です
SET input_format_parquet_import_nested = 1;

CREATE TABLE default.mytable
(
        `timestamp` DateTime64(6),
        `some_text` String
)
ENGINE = MergeTree
ORDER BY (timestamp);
テーブルを作成したら、クラスター内に ClickHouse レプリカが複数ある場合は、エクスポートを高速化するために設定 parallel_distributed_insert_select を有効にします。ClickHouse ノードが 1 つしかない場合は、この手順は省略できます。
SET parallel_distributed_insert_select = 1;
最後に、INSERT INTO SELECT command を使用して、GCS から ClickHouse のテーブルにデータを挿入できます。これは、SELECT クエリの結果に基づいてテーブルにデータを挿入するコマンドです。INSERT するデータを取得するには、GCS は Amazon S3 と相互運用可能であるため、s3Cluster function を使用して GCS bucket からデータを取得できます。ClickHouse ノードが 1 つしかない場合は、s3Cluster function の代わりに s3 table function を使用できます。
INSERT INTO mytable
SELECT
    timestamp,
    ifNull(some_text, '') AS some_text
FROM s3Cluster(
    'default',
    'https://storage.googleapis.com/mybucket/mytable/*.parquet.gz',
    '<ACCESS_ID>',
    '<SECRET>'
);
上記のクエリで使用している ACCESS_IDSECRET は、GCS バケットに関連付けられた HMAC キー です。
Nullable カラムをエクスポートする場合は ifNull を使用してください上記のクエリでは、some_text カラムに対して ifNull 関数 を使用し、デフォルト値を指定して ClickHouse テーブルにデータを挿入しています。ClickHouse のカラムを Nullable にすることもできますが、パフォーマンスに悪影響を及ぼす可能性があるため、推奨されません。代わりに、SET input_format_null_as_default=1 を設定すると、欠損値や NULL 値は、各カラムにデフォルト値が指定されている場合、そのデフォルト値に置き換えられます。
3

データのエクスポートが正常に行われたかを確認する

データが正しく挿入されたかどうかを確認するには、新しいテーブルに対して SELECT クエリを実行するだけです。
SELECT * FROM mytable LIMIT 10;
さらにBigQueryテーブルをエクスポートするには、追加する各テーブルについて上記の手順を繰り返すだけです。

参考資料とサポート

このガイドに加えて、ClickHouse を使って BigQuery を高速化する方法と増分インポートへの対応方法を紹介したブログ記事も併せてご覧になることをおすすめします。 BigQuery から ClickHouse へのデータ転送で問題が発生している場合は、support@clickhouse.com までお気軽にお問い合わせください。
最終更新日 2026年6月10日