既にFivetranからBigQueryに同期中のテーブルをパーティション分割テーブルに移行する

OK let's partitioooooooooooon!!!
2021.10.26

大阪オフィスの玉井です。

FivetranとBigQueryの組み合わせで使用しているユーザーさんが増えてきました。

BigQueryの重要な設定としてパーティションがありますが、何も意識せずにFivetranを使ってBigQueryにデータを同期している場合、BigQueryに作成されるテーブルに対して(どれだけデータ量があろうが)パーティションが勝手に設定されることはありません。

Fivetranは設定がめちゃくちゃ楽なため、クリックぽちぽちするだけで、BigQueryにデータをガンガン同期させることができます。ガンガン同期させられるので、そのデータに対してBIツール等からガンガンアクセスすることになりますが、パーティションが無いので、スキャン量がすごいことになり、最終的に課金がすごいことに…みたいな悲劇が発生しないとも限りません。

今回は、すでにFivetranで同期を始めてしまったテーブルに対して、同期状態はそのままで、パーティションを設定する方法をご紹介します。

やってみた

公式情報

1. (対象の)Connectorの同期を止めておく

作業中に同期が始まると面倒なので、(設定したいテーブルに関連しているConnectorを)一時停止しておきます。

2. パーティションを設定したいテーブルの確認

今回は下記のテーブルにパーティションを設定します。ConnectorとしてはGoogle Analyticsです(ZendeskのGuideに仕込んでいるGAのデータなので、このようなテーブル名になっています)。

今はパーティションが無いため、存在していないデータを日付でフィルタリングしても、テーブル全体がスキャンされるようになっています。

3. 対象テーブルの「パーティションを設定した版」を作成(コピー)する

ちょっとややこしい日本語になりましたが、対象テーブルをコピーするついでにパーティションを設定する感じです。

作業としては、公式ドキュメントに用意されているクエリを実行するだけです。今回はDATE型のカラムをパーティションカラムにするので、下記のクエリを実行します。

create table tamai-rei.google_analytics.copy
partition by date
as select * from `tamai-rei.google_analytics.zendesk_support`;
drop table `tamai-rei.google_analytics.zendesk_support`;

copyという名前のテーブルができました。コピーしたものなので、中身は対象テーブルと同じです。加えて、dateというカラムにパーティションが設定されています。

4. copyテーブルを元のテーブル名でコピーする

先程複製したテーブルを、さらにコピーします。今度は普通のコピーですが、テーブル名を元の名前に戻します。

こんな感じで、元のテーブルが復活した形になりました。

しかし、パーティションを設定したcopyテーブルが元になっているので、パーティションが設定されています。

5. copyテーブルを削除する

これはもういらないので消しておきましょう。

drop table tamai-rei.google_analytics.copy;

同期に問題がないかチェック

作業として上記の通りですが、この状態でFivetran側が普通に動くのか確認しておきます。

Connectorを再開させて、即同期を実行しました。結論からいうと問題なし。以前からの増分同期も問題なく実行されています。作業の最後に「元のテーブル名の戻す」というのがありましたが、Fivetranはこのテーブル名で追いかけるので、ここさえミスってなければ、何事もなかったかのように増分同期を続けてくれます。

そして、改めてパーティションカラムを利用したクエリを確認します。パーティションが効いているため、スキャン量が抑えられています(というか、該当データがないためゼロ)。

おわりに

公式ドキュメントにありますが、実はFivetranで同期を始める前に、パーティション設定されたテーブルを用意しておくことで、最初からパーティション分割テーブルに同期を行うことができます。ただし、この方法は、まだカラムが存在していため、取込時間がパーティションの対象となります。そうではなく別途パーティションにしたいカラムがある場合は、この方法をとることになると思います。