こんにちは、川田です。
今回は BigQuery Data Transfer Service で、取込対象となる Google Cloud Storage 上オブジェクト・パスを動的に指定する方法を確認します。
結論
ランタイム・パラメーターの機能を利用します。
Cloud Storage の転送でのランタイム パラメータ
例えば、以下のようなパラメーターで転送を設定した場合(key data_path_template
の gcs パスに注目)。
$ params=$(cat <<-EOF
{
"destination_table_name_template": "sample",
"data_path_template": "gs://raw-bucket-asia-northeast1-cm-kawata/input/{run_time|\"%Y-%m-%d\"}/{run_time|\"%H\"}/input.csv",
"write_disposition": "APPEND",
"file_format": "CSV",
"allow_jagged_rows": "true"
}
EOF
)
$ bq mk \
--transfer_config \
--project_id=<PROJECT-ID> \
--data_source=google_cloud_storage \
--display_name=job-dynamic-object-path \
--target_dataset=demo \
--service_account_name=sa-bq-transfer-job@<PROJECT-ID>.iam.gserviceaccount.com \
--params="${params}"
転送の実行時刻が 2024-04-03 03:00:00 (UTC)
の場合、以下のような GCS パスとして評価されます。
gs://raw-bucket-asia-northeast1-cm-kawata/input/2024-04-03/03/input.csv
以降で、実際に設定を行い動作を確認します。
事前準備
事前の準備を行います。
BigQuery 側でロード先となるテーブルを作成
データのロード先となるデータセットを作成します。今回は demo という名前で作成しました。
$ bq mk --location=asia-northeast1 \
--dataset \
--max_time_travel_hours=48 \
--storage_billing_model=PHYSICAL \
<PROJECT-ID>:demo
データのロード先となるテーブルを作成します。今回は sample という名前で作成しました。
$ bq mk \
--table \
<PROJECT-ID>:demo.sample \
col1:STRING,col2:STRING
取込対象となるファイルを用意
ファイルを配置する GCS のバケットを作成します。
$ gcloud storage buckets create gs://raw-bucket-asia-northeast1-cm-kawata \
--project <PROJECT-ID> --location asia-northeast1
取込ファイルとなる CSV ファイルを、作成したバケット上に作成します。
$ cat <<EOF | gcloud storage cp - gs://raw-bucket-asia-northeast1-cm-kawata/input/2024-04-03/03/input.csv
AAA,AAA
BBB,BBB
EOF
$
$ gcloud storage cat gs://raw-bucket-asia-northeast1-cm-kawata/input/2024-04-03/03/input.csv
AAA,AAA
BBB,BBB
作成先のパスは下記となります。
gs://raw-bucket-asia-northeast1-cm-kawata/input/2024-04-03/03/input.csv
BigQuery Data Transfer Service 向けのサービスアカウントを作成
BigQuery Data Transfer Service で利用するサービスアカウントを作成します。
$ gcloud --project <PROJECT-ID> iam service-accounts create sa-bq-transfer-job \
--description="sa-bq-transfer-job" \
--display-name="sa-bq-transfer-job"
作成したサービスアカウントに、roles/bigquery.admin
と roles/storage.objectUser
の事前定義ロールを付与しておきます。
$ gcloud projects add-iam-policy-binding <PROJECT-ID> \
--member="serviceAccount:sa-bq-transfer-job@<PROJECT-ID>.iam.gserviceaccount.com" \
--role="roles/bigquery.admin"
$ gcloud projects add-iam-policy-binding <PROJECT-ID> \
--member="serviceAccount:sa-bq-transfer-job@<PROJECT-ID>.iam.gserviceaccount.com" \
--role="roles/storage.objectUser"
BigQuery Data Transfer Service の転送の設定
それでは、実際に転送を設定していきます。
動的に GCS のパスを指定するには、key data_path_template
の値を、ランタイムパラメーターを利用して指定します。
パラメーターとして利用できるものに、以下の2つが用意されています。
パラメーター | 値 | 例 |
---|---|---|
run_time | Formatted timestamp | 2024-04-03T06:04:00+00:00 |
run_date | %Y%m%d | 20240403 |
パラメーターには、テンプレートシンタックスが用意されており、以下のように値を操作することができます。
Templated parameter 例 | 値 |
---|---|
mytable_{run_time|"%Y%m%d"} | mytable_20180215 |
mytable_{run_time+25h|"%Y%m%d"} | mytable_20180216 ※25 時間後の値になる |
使用上の注意があります。
- run_time、offset、time 形式の間に空白文字は使用できません。
- 文字列にリテラル中かっこを含めるには、
'\{' and '\}'
としてエスケープできます。 - time_format に
"YYYY|MM|DD"
などのリテラル引用符や縦線を含めるには、'\"'
や'\|'
のフォーマット文字列でエスケープします。
より詳細な情報は、公式ドキュメントを参照ください。
Cloud Storage の転送でのランタイム パラメータ
転送を設定するコマンドは以下となります(key data_path_template
の gcs パスに注目)。
$ params=$(cat <<-EOF
{
"destination_table_name_template": "sample",
"data_path_template": "gs://raw-bucket-asia-northeast1-cm-kawata/input/{run_time|\"%Y-%m-%d\"}/{run_time|\"%H\"}/input.csv",
"write_disposition": "APPEND",
"file_format": "CSV",
"allow_jagged_rows": "true"
}
EOF
)
$ bq mk \
--transfer_config \
--project_id=<PROJECT-ID> \
--data_source=google_cloud_storage \
--display_name=job-dynamic-object-path \
--target_dataset=demo \
--service_account_name=sa-bq-transfer-job@<PROJECT-ID>.iam.gserviceaccount.com \
--params="${params}"
上記の data_path_template
の値では、転送の実行時刻が 2024-04-03 03:00:00 (UTC)
の場合、以下のような GCS パスとして評価されます。
gs://raw-bucket-asia-northeast1-cm-kawata/input/2024-04-03/03/input.csv
コマンドラインを実行したタイミングで、転送が作成され、実際の転送処理が開始されます。コマンドラインから作成の場合、作成時刻を基準として 24 時間間隔のスケジュールが自動的に設定されます。
Caution: When you create a Cloud Storage transfer using the command-line tool, the transfer configuration is set up using the default value for Schedule (every 24 hours).
Set up a Cloud Storage transfer
確認
転送の処理結果を確認します。
ランタイムパラメーターが正しく評価されて、テーブルへのロードが成功しています。
その他補足
以下、補足となります。
data_path_template
での GCS パスの指定では、ランタイムパラメーターのほか、ワイルドカード(*)も利用できます- ランタイムパラメーターでの値の指定は、ロード先の BigQuery テーブルを登録する Key
destination_table_name_template
でも利用できます - AWS S3 上のパスを指定する場合にも、ランタイムパラメーターを利用できます