【BigQuery】PythonでBQジョブを表示・キャンセルする方法

# はじめに
こんにちは！
BigqueryのPython用APIを使用し、実行中のBQジョブをキャンセルする機能を実装したので、その際に使用したメソッドについてまとめます。

###### 参考：公式サイト

https://cloud.google.com/python/docs/reference/bigquery/latest/index.html
###### 参考：公式サンプルコード
[・ジョブのリスト表示](https://cloud.google.com/bigquery/docs/samples/bigquery-list-jobs?hl=ja)
[・ジョブをキャンセルする](https://cloud.google.com/bigquery/docs/samples/bigquery-cancel-job?hl=ja)
[・ジョブ プロパティを取得する](https://cloud.google.com/bigquery/docs/samples/bigquery-get-job?hl=ja)

# Bigqueryジョブとは
BigQueryにおいて、データのロード、クエリの実行、エクスポートなど、データに対する操作は「ジョブ」として実行されます。

# 実行中のジョブを一覧表示する：list_jobs
プロジェクト内で実行中、または最近実行されたジョブを一覧で取得するには、client.list_jobs()メソッドを使用します。

```python:基本使用例
from google.cloud import bigquery

client = bigquery.Client()

for job in client.list_jobs():
    print(f"  ジョブID: {job.job_id}")
    print(f"  タイプ: {job.job_type}")
```
#### フィルタリングとページネーション
list_jobs()には、ジョブのフィルタリングやページネーションを制御するための引数が用意されています。一部を紹介します。

| 引数 | 説明 |
|:-------|:--------------------|
| project  | プロジェクトを指定します  |
|  all_users | Trueに設定すると、プロジェクト内のすべてのユーザーが開始したジョブを取得します  |
|  [min/max]_creation_time| ジョブの作成日時で範囲を指定します  |
|  state_filter | 特定のステータスのジョブのみをフィルタリングします (PENDING, RUNNING, DONE）
 
:::note warn
all_usersをTrueにして実行するにはbigquery.job.listAllの権限が必要です。
:::

```python:引数でフィルタリングする例
from google.cloud import bigquery

project_name=XXX
hours_ago=XXX
client = bigquery.Client()

for job in client.list_jobs(
    project=project_name,
    all_users=True,
    min_creation_time=hours_ago,
    state_filter=["PENDING","RUNNING"]
):
    #例：タイプがcopyやloadの場合は宛先テーブルを出力
    if job.job_type in ("copy", "load"):
        print(f"  宛先プロジェクト: {job.destination.project}")
        print(f"  宛先データセット: {job.destination.dataset_id}")
        print(f"  宛先テーブル: {job.destination.table_id}")
        
    #例：タイプがqueryの場合はクエリ内容を出力
    if job.job_type == "query":
        print(f"  クエリ内容: {job.query}")
    
```
[公式サンプルコード(ジョブのリスト表示)](https://cloud.google.com/bigquery/docs/samples/bigquery-list-jobs?hl=ja)もご覧ください。

# 実行中ジョブをキャンセルする：cancel_job
ジョブを中断するには、client.cancel_job()メソッドを使用します。
このメソッドは、指定されたジョブIDのジョブを強制的に終了させます。
```python:基本使用例
from google.cloud import bigquery

client = bigquery.Client()

job = client.cancel_job('キャンセルしたいジョブID')
```
[公式サンプルコード(ジョブをキャンセルする)](https://cloud.google.com/bigquery/docs/samples/bigquery-cancel-job?hl=ja)もご覧ください。

cancel_job()は呼び出し後すぐにジョブが停止するわけではありません。
そのため、次に紹介するメソッドを使用してキャンセルされたことを確認しました。

# 特定のジョブの詳細を取得する：get_job
ジョブIDを使って特定のジョブの詳細情報を取得するには、client.get_job()メソッドを使用します。

```python:基本使用例
from google.cloud import bigquery

client = bigquery.Client()

job = client.get_job('詳細を表示したいジョブID')
    print(f"  ステータス: {job.state}")
```
:::note
ジョブをキャンセルした場合でも、ステータスはDONEになります。
:::

[公式サンプルコード(ジョブ プロパティを取得する)](https://cloud.google.com/bigquery/docs/samples/bigquery-get-job?hl=ja)もご覧ください。

# おわりに
今回はBigqueryのPython用APIを使用して、BigQueryジョブを表示・キャンセルする方法についてまとめました。


株式会社ジールはMicrosoft Azure やAWS（Amazon Web Services）、Google Cloud Platform（GCP）、Oracle Cloud Infrastructure（OCI）など、多彩なクラウドプラットフォーム構築・運用の知見を有しています。そのため、複数のクラウドサービスを組み合わせるマルチクラウド環境においても、ベンダーロックインを回避し、お客様のご要望に応じた最適なクラウドプラットフォームの構築・運用への対応が可能です。​

最後までご覧いただき、ありがとうございました！

https://www.zdh.co.jp/products-services/cloud-data/