BigQueryのテーブルコピー方法3選
はじめに
データ・エージェンシー高橋です。
データパイプラインを構築するなかで、Google Cloud以外のBIツールと連携するために、定期的にBigQueryのテーブルをコピーする場面があります。
方法としては、SQLによるコピーとbqコマンドによるコピーの2種類に大きく分けられますが、ここでは実装がより単純であり「スケジュールされたクエリ」も利用できるSQLによる方法をご紹介します。
なお今回は、コピー元とコピー先のテーブルの値を全く同じとするケースを想定しており、VIEWやMATERIALIZED VIEWは扱いません。また、コピー元テーブルのことをベーステーブルと呼ぶこととします。
概要
方法 | 特徴 | メリット・デメリット |
---|---|---|
COPY | 値渡しのイメージ。コンソールでの [ テーブルのコピー ] と同様の処理 | コピーテーブルでも、ベーステーブルと同じストレージ料金が発生する。他の方法よりクエリ実行処理に時間がかかる |
CLONE | 基本的には参照渡しのイメージ | クエリ実行処理が速い |
SNAPSHOT | 基本的には参照渡しのイメージ | クエリ実行処理が速い。読み取り専用 |
準備
まず、以下のクエリにて検証用のベーステーブルを作成します。
-- テーブル作成
CREATE OR REPLACE TABLE `my_project.dataset_a.table_origin` (
id INT64,
name STRING,
date DATE
);
-- レコード登録
INSERT INTO
`my_project.dataset_a.table_origin` (
id,
name,
date
)
VALUES
(1, "AAA", CURRENT_DATE("Asia/Tokyo")),
(2, "BBB", CURRENT_DATE("Asia/Tokyo")),
(3, "CCC", CURRENT_DATE("Asia/Tokyo")) ;
方法1 - COPY
ベーステーブルを単純にコピーする方法です。クエリ実行による料金は発生しません。ストレージ料金はベーステーブルと同様に発生します。
CREATE OR REPLACE TABLE
`my_project.dataset_b.table_copy`
COPY
`my_project.dataset_a.table_origin`;
方法2 - CLONE
ベーステーブルの値をクローンテーブルへ参照渡しするイメージです。クエリ実行による料金は発生しません。ストレージ料金は、クローンを実行した時点のベーステーブルとの差分について発生します。詳しくは以下をご参照ください。
DROP TABLE IF EXISTS
`my_project.dataset_b.table_clone`;
CREATE TABLE
`my_project.dataset_b.table_clone`
CLONE
`my_project.dataset_a.table_origin`;
なお、「DROP TABLE IF EXISTS」を使わずに「CREATE TABLE」を「CREATE OR REPLACE TABLE」とすると、クローンを実行した時刻が更新されませんでしたので、ストレージ料金を考えると「CREATE OR REPLACE TABLE」を使わないほうがよいでしょう。
方法3 - SNAPSHOT
CLONEによる方法と似ていますが、スナップショットは読み取り専用である点が大きな違いです。クエリ実行による料金は発生しません。ストレージ料金は、クローンを実行した時点のベーステーブルとの差分について発生します。詳しくは以下をご参照ください。
DROP SNAPSHOT TABLE IF EXISTS
`my_project.dataset_b.table_snapshot`;
CREATE SNAPSHOT TABLE
`my_project.dataset_b.table_snapshot`
CLONE
`my_project.dataset_a.table_origin`;
ここで、「DROP SNAPSHOT TABLE IF EXISTS」を使わずに「CREATE SNAPSHOT TABLE」を「CREATE OR REPLACE SNAPSHOT TABLE」とすると構文エラーとなるため、どちらを使うべきか迷うことはありません。
いずれの方法も、料金体系が変更されることがあります。ご利用の際には、ご自身で最新情報のご確認をお願いします。
まとめ
BigQueryのテーブルをクエリによってコピーする方法として、COPY、CLONE、SNAPSHOTの3通りの方法をご紹介しました。説明の流れとしてCOPYから始めましたが、CLONE、SNAPSHOTを用いたほうが料金の点でメリットがあるため、実際にCOPYを使うシーンは多くないかもしれません。
これらのクエリは「スケジュールされたクエリ」に保存して定期実行できますので、データパイプラインの一部として活用できます。
株式会社データ・エージェンシー
弊社では、エンジニア経験を活かしてデータエンジニアリングにチャレンジしたい方を募集しています。採用情報や社員インタビューについては以下をご参照ください!
- 【フルリモート】【全国求人】データエンジニア
https://open.talentio.com/r/1/c/dataagency/pages/66768
Discussion