🐝

BigQueryのテーブルコピー方法3選

2024/04/02に公開

はじめに

データ・エージェンシー高橋です。

データパイプラインを構築するなかで、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を使うシーンは多くないかもしれません。

これらのクエリは「スケジュールされたクエリ」に保存して定期実行できますので、データパイプラインの一部として活用できます。

株式会社データ・エージェンシー

弊社では、エンジニア経験を活かしてデータエンジニアリングにチャレンジしたい方を募集しています。採用情報や社員インタビューについては以下をご参照ください!

dataAgency Tech Blog

Discussion