やりたいこと
クエリを定期実行したい場面がありました。Pythonプログラム内でbqコマンドを実行しようかと思ってたとき、BigQueryコンソールを眺めていると「スケジュール」という文字が…これを使えば、BigQueryで完結するのでは。
業務で使ったことが無かったので、試してみます。
手順
今回はサンプルデータの「word」カラムからランダムに100個値を取り出すクエリを、スケジューリングさせることにします。
SELECT word, rand() AS random
FROM `publicdata.samples.shakespeare` AS shakespeare
ORDER BY random
LIMIT 100
クエリを入力したら「スケジュール」->「スケジュールされたクエリを有効にする」を押します。
しばらくしてページを更新し再度「スケジュール」を押すと「スケジュールされたクエリを新規作成」が選べるようになっているので押します。
スケジュールの設定画面が開きます。
詳細とスケジュール
「スケジュールされたクエリの名前」
このスケジュールの名称を設定します。
スケジュールオプション
「繰り返しの頻度」
毎時、毎日、毎週、毎月、カスタム、オンデマンド から選べます。
カスタムとすると、頻度を入力するテキストボックスが出てくるのですが、どのように設定するのか公式ドキュメントで調べてみました。
公式ドキュメントより引用↓
頻度を変更するには、[繰り返し] オプションを [毎日] から目的の頻度に変更します。
カスタム頻度を指定するには、[カスタム] を選択し、[カスタム スケジュール] に Cron と同様の時間指定を入力します(例: every 3 hours)。
最短許容時間は 15 分です。
有効な値の説明については、TransferConfig の schedule フィールドをご覧ください。
時刻は UTC で指定します。
有効な形式の例: 1st,3rd monday of month 15:30、every wed,fri of jan,jun 13:15、first sunday of quarter 00:00。
形式の詳細については、https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-cron-yaml#the_schedule_format をご覧ください。
https://cloud.google.com/appengine/docs/flexible/python/scheduling-jobs-with-cron-yaml#the_schedule_format
の「カスタムの間隔」が参考になりそうです。
今回は、毎時で設定したいので素直に「毎時」を選べばいいのですが、
なんとなく「カスタム」のほうで「every 1 hours」を設定してみました。
「開始時刻をスケジュール」を選択すると「開始日と実行時間」が、
「終了時刻を設定」を選択すると「終了日」が、
設定できるようになります。
軽いクエリいえど毎時ずっと実行されるのもあれなので、今回は終了時刻を設けました。
クエリ結果の書き込み先
「データセット名」「テーブル名」
事前に、書き込み先のテーブルを作っておきました。
今回は「sample」データセットに「schedule_sample」テーブルを作成しました。ちなみにこちらのテーブルは、取り込み時間で分割されたテーブル(1日)となっています。
「宛先テーブルの書き込み設定」
追加か上書きかを選択します。
設定が一通り終了したら「スケジュール」を押します。
初回は「BigQuery Data Transfer Service」を許可するかどうかのポップアップが出ますので、許可してあげます。
「スケジュールされたクエリ」を開くと、先程設定したクエリが登録されているのが確認できました。
次回のスケジュールは、日本時間の「2021/12/29 10:22:00」となっています。
開始時刻を「2021/12/29 09:22:00」、間隔を「every 1 hours」に設定したので、開始時刻の次の1時間目から定期実行となるのですね。
実行の時を座して待ちます。
さて、10:22を過ぎました。再度「スケジュールされたクエリ」一覧を見てみると…
ステータスが緑になり、次回のスケジュールも日本時間の「2021/12/29 11:22:00」と1時間進んでいますね。
10:22に、問題なく実行されています。
テーブルの今日のパーティションにも、問題なく値が入っていました。