既にFivetranからBigQueryに同期中のテーブルをパーティション分割テーブルに移行する
大阪オフィスの玉井です。
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で同期を始める前に、パーティション設定されたテーブルを用意しておくことで、最初からパーティション分割テーブルに同期を行うことができます。ただし、この方法は、まだカラムが存在していため、取込時間がパーティションの対象となります。そうではなく別途パーティションにしたいカラムがある場合は、この方法をとることになると思います。