SnowflakeからClickHouseへの移行
本ガイドでは、SnowflakeからClickHouseへデータを移行する方法について説明します。
SnowflakeとClickHouse間でデータを移行するには、転送用の中間ストレージとしてS3などのオブジェクトストアを使用する必要があります。移行プロセスでは、SnowflakeのCOPY INTOコマンドとClickHouseのINSERT INTO SELECTコマンドを使用します。
Snowflake からデータをエクスポートする

上の図に示されているように、Snowflake からデータをエクスポートするには外部ステージを利用する必要があります。
次のスキーマを持つ Snowflake テーブルをエクスポートするとします。
このテーブルのデータを ClickHouse データベースに移行するには、まずこのデータを外部ステージにコピーする必要があります。データをコピーする際の中間フォーマットとしては、Parquet の利用を推奨します。Parquet であれば、型情報を共有でき、精度を保持できるうえ、圧縮効率も高く、分析で一般的なネスト構造もネイティブにサポートしているためです。
以下の例では、Parquet と必要なファイルオプションを表現するために、Snowflake 上で名前付きファイルフォーマットを作成します。次に、コピーされたデータセットを格納するバケットを指定します。最後に、そのデータセットをバケットにコピーします。
約 5TB のデータセットで最大ファイルサイズが 150MB、かつ同じ AWS us-east-1 リージョン内にある 2X-Large Snowflake ウェアハウスを使用する場合、S3 バケットへのデータのコピーには約 30 分かかります。
ClickHouse へのインポート
データが中間オブジェクトストレージにステージングされたら、以下のように s3 テーブル関数 などの ClickHouse の関数を使用して、テーブルにデータを挿入できます。
この例では AWS S3 向けの s3 テーブル関数 を使用していますが、Google Cloud Storage には gcs テーブル関数、Azure Blob Storage には azureBlobStorage テーブル関数 を使用できます。
対象となるテーブルのスキーマを次のように想定します:
次に、INSERT INTO SELECT コマンドを使用して、S3 上のデータを ClickHouse のテーブルに挿入します。
元の Snowflake テーブルスキーマ内の VARIANT 列と OBJECT 列は、デフォルトでは JSON 文字列として出力されます。そのため、ClickHouse に挿入する際には、これらをキャストする必要があります。
some_file のようなネストした構造は、Snowflake によるコピー処理の際に JSON 文字列へと変換されます。このデータをインポートするには、上記の JSONExtract 関数 を使用して、ClickHouse への挿入時にこれらの構造を Tuple 型に変換する必要があります。