BigQueryのスケジュールされたクエリを試してみる

# やりたいこと
クエリを定期実行したい場面がありました。Pythonプログラム内でbqコマンドを実行しようかと思ってたとき、BigQueryコンソールを眺めていると「スケジュール」という文字が…これを使えば、BigQueryで完結するのでは。
業務で使ったことが無かったので、試してみます。

# 手順
今回はサンプルデータの「word」カラムからランダムに100個値を取り出すクエリを、スケジューリングさせることにします。

```sql
SELECT word, rand() AS random
FROM `publicdata.samples.shakespeare` AS shakespeare
ORDER BY random
LIMIT 100
```

クエリを入力したら「スケジュール」->「スケジュールされたクエリを有効にする」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/75c5459c-5b50-c81d-7d45-787e980854ad.png)

「APIを有効にする」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/fb99e3e7-c510-bde7-d7a9-3db08e4f13a4.png)

しばらくしてページを更新し再度「スケジュール」を押すと「スケジュールされたクエリを新規作成」が選べるようになっているので押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/d1f092eb-37f7-c7bf-900e-69d766507b5c.png)

スケジュールの設定画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/92e760b2-9515-9cea-7a90-076ebc624a6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/963b5121-6571-154f-a2d0-d8d52fbf637e.png)




#### 詳細とスケジュール
「スケジュールされたクエリの名前」
このスケジュールの名称を設定します。

#### スケジュールオプション
「繰り返しの頻度」
毎時、毎日、毎週、毎月、カスタム、オンデマンド　から選べます。

カスタムとすると、頻度を入力するテキストボックスが出てくるのですが、どのように設定するのか公式ドキュメントで調べてみました。

[公式ドキュメント](https://cloud.google.com/bigquery/docs/scheduling-queries#set_up_scheduled_queries)より引用↓

```text
頻度を変更するには、[繰り返し] オプションを [毎日] から目的の頻度に変更します。
カスタム頻度を指定するには、[カスタム] を選択し、[カスタム スケジュール] に Cron と同様の時間指定を入力します（例: every 3 hours）。
最短許容時間は 15 分です。
有効な値の説明については、TransferConfig の schedule フィールドをご覧ください。
```

[TransferConfigの公式ドキュメント](https://cloud.google.com/bigquery-transfer/docs/reference/datatransfer/rest/v1/projects.locations.transferConfigs#resource:-transferconfig)より引用↓


```text
時刻は 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」テーブルを作成しました。ちなみにこちらのテーブルは、取り込み時間で分割されたテーブル（１日）となっています。

「宛先テーブルの書き込み設定」
追加か上書きかを選択します。


設定が一通り終了したら「スケジュール」を押します。
初回は「BigQuery Data Transfer Service」を許可するかどうかのポップアップが出ますので、許可してあげます。

「スケジュールされたクエリ」を開くと、先程設定したクエリが登録されているのが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/0b3f7456-da57-3dae-1993-2f1804092a0e.png)

次回のスケジュールは、日本時間の「2021/12/29 10:22:00」となっています。
開始時刻を「2021/12/29 09:22:00」、間隔を「every 1 hours」に設定したので、開始時刻の次の１時間目から定期実行となるのですね。

実行の時を座して待ちます。

さて、10:22を過ぎました。再度「スケジュールされたクエリ」一覧を見てみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/f46e985f-024e-07be-4eda-9c0774a6a52e.png)
ステータスが緑になり、次回のスケジュールも日本時間の「2021/12/29 11:22:00」と1時間進んでいますね。

表示名を押し実行履歴を見てみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/19a0b79e-58c9-e2f5-74db-06b41d9e5014.png)

10:22に、問題なく実行されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/ae9b37bd-9d84-0c9a-78e4-fffd580c49a3.png)

テーブルの今日のパーティションにも、問題なく値が入っていました。