はじめに
既に運用されているBigQueryの一部テーブルを、別プロジェクトのテーブルへコピーするための参考手順となります。
データセットのコピーについて
GoogleCloud の公式ドキュメントを参照すると「データセットのコピー」という項目があり、手順が記載されています。
https://cloud.google.com/bigquery/docs/managing-datasets?hl=ja#copy-datasets
しかし、2024/09/24現在ではまだベータ版となっており、以下のような注意書きがある状況です。
ベータ版の説明は以下
https://cloud.google.com/products?hl=ja#product-launch-stages
利用はできそうですが、SLAやテクニカルサポートの義務はないとのことから、別の方法を検討する事に。
bq コマンドでのコピー
コピー方法をいくつか検討しました。
案① 既存BigQueryからエクスポートし、新規BigQueryへインポートする方法
運用中のBigQuery各テーブルをCloud Storageへエクスポートし、BigQuery追加ページでエクスポートしたファイルから読み込む手順を選定し実施しました。
エクスポートはCSV形式でおこない、インポート時にスキーマを自動検出をオンにし、インポートしてみたのですが、テーブル種別がうまく引き継がれず、スキーマ情報を手動で入力しました。
元のスキーマ情報をGoogleCloudコンソール上でコピーし、インポート時にペーストしていたところ、フィールド名の頭に半角スペースが入ってしまいました。
しかも、GoogleCloudコンソール上では、フィールド名頭に半角スペースが入っておらず、ミスにつながる可能性があったので、こちらの案はボツとなりました。
案② コマンドを利用したコピー
上記案①のようなミスを防ぐために、作業をコマンドで実施するように検討する事に。
調べてみたところ bq コマンドで、別プロジェクトを指定できることがわかりました。
bq コマンドライン ツール リファレンス
https://cloud.google.com/bigquery/docs/reference/bq-cli-reference?hl=ja
bqコマンドを利用することで以下のようにデータセットをコピーすることができました。
# 1.コピー元の対象テーブルのスキーマ情報を作成(誤入力を防止)
bq show -schema --project_id <既存プロジェクト名> <コピー元データセット名>.<コピー元テーブル名> > schema.json
# 2.コピー先へ空のテーブルを作成
bq mk --project_id <コピー先プロジェクト名> --table <コピー先データセット名>.<コピー先テーブル名> schema.json
# 3.コピー先テーブルへコピー実行
bq query --project_id <コピー先プロジェクト名> --destination_table <コピー先データセット名>.<コピー先テーブル名> --use_legacy_sql=false "select * from <既存プロジェクト名>.<既存データセット名>.<既存テーブル名>;"
コピー後は、コピー元とコピー先のテーブル詳細画面を開き、行数やパーティションなどの数が同様であるかを確認し、作業終了とした。
■ 身につけた知識
・極力、手入力を避けた方が良い
・やむなく手入力してしまった場合、設定値確認はコマンドにて実施しよう。