はじめに
- 2019年8月に、copying datasetsがβとしてリリースされました。
- この記事では、bqコマンドを使ってdatasetのコピーを試してみます(コンソールでもできます)。
- Datasetのコピー機能によって、copyやrenameが実現できるようになりました👏
- ドキュメントとしてはここに全部書いているのですが、あまり親切ではなかったので、qiitaにちょっと起こしてみました。
事前準備
- BigQuery Data Transfer Serviceを利用するので、APIの有効化が必要です。詳細は、こちらのドキュメントに全部書いているので、どうぞ。
- また、BigQueryの適切な権限が必要です。権限はこちらのドキュメントを見てください。
実行
BigQuery Data Transfer Serviceの有効化が終わっている状態で、bqコマンドを実行してみます。
サンプルの前提
- project名
- foo-project
- location
- asia-northeast1
- ソースdataset名
- dataset1
- ターゲットdataset名
- datase2
同一locationでのdatasetコピーを試してみます。
実行サンプル
まず、copy先の空のdatasetをつくっておきます。
bq --location=asia-northeast1 mk --dataset foo-project:dataset2
次にBigQuery Data Transfer Serviceのタスクを登録します
bq mk \
--location=asia-northeast1 \
--transfer_config \
--project_id=foo-project \
--data_source=cross_region_copy \
--target_dataset=dataset2 \
--display_name='dataset1 -> dataset2 copy' \
--params='{"source_dataset_id":"dataset1","source_project_id":"foo-project","overwrite_destination_table":"true"}'
いくつかパラメータについて補足すると
- overwrite_destination_table
- 以前にコピーしたテーブルを切り捨ててすべてのデータを更新する
上記を実行すると、下記のようなレスポンスがあります。
https://www.gstatic.com/xxx
Please copy and paste the above URL into your web browser and follow the instructions to retrieve an authentication code.
Enter your authentication code here:
https://www.gstatic.com/xxx にアクセスして、許可すると、authentication code が発行されるので Enter your authentication code here: に続けて入力してください。
Transfer configuration 'projects/xxx' successfully created. というメッセージが表示されれは、成功です。
上記でレスポンスのあった、リソースIDを指定して、bq showすると、ステータスなどが表示できます。
bq show --format=prettyjson \
--transfer_config projects/xxx
同様のことは、すべてコンソールからもできるのですが、数が多いときはbqコマンドで実行できたほうが便利ですよね。
残った問題
上記の例で実行すると、毎日実行される日次の転送設定として登録されてしまう。
今は、OneShotの実行を行いたい場合は、初回転送実行後、転送設定を消しているけど、もうちょいいいやり方(オプション等)がないか模索中。
2025年の補足
- bq コマンドの help を見てたら、
no_auto_schedulingというオプションを見つけました。 - これをつけることで自動スケジューリングされない転送設定を作ることができそうです。
- ref. https://docs.cloud.google.com/bigquery/docs/reference/bq-cli-reference?hl=ja
その場合、以下のような transfer run で one shot の手動実行が可能です。
bq mk \
--transfer_run \
--run_time="$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
"projects/xxx/locations/asia-northeast1/transferConfigs/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"