BigQuery Continuous query を試す！

# BigQuery Continuous query を試す！
## はじめに
この記事は 2024年8月28日に行われた color is【クラウドLT大会vol.10】の発表内容をもとに作成しております。

https://saison-coloris.connpass.com/event/327849/

https://speakerdeck.com/yu_sa18/bigquery-continuous-query

2024年4月で行われた Google Cloud Next '24 にて発表された Continuous query が8月にプレビューとなりました:tada:
この記事では機能の詳細や検証などをまとめます。

## Continuous query とは
### 概要
Continuous query を使うことによって、BigQuery にデータが書き込まれたタイミングでのクエリ実行が可能になり、リアルタイムデータに対する分析ができるようになりました。
また Continuous query プレビューと同じタイミングで BigQuery から Pub/Sub と Bigtable へのエクスポートもプレビューとなったため、他アプリケーションやサービスへの連携がさらに容易になりました。

https://cloud.google.com/blog/products/data-analytics/bigquery-continuous-queries-makes-data-analysis-real-time?hl=en

### 使い始めるには
2024年8月時点、Continuous query を使うにはプレビュー申し込みフォームより申請が必要です。
ドキュメント上部にフォームのリンクが公開されています。

https://cloud.google.com/bigquery/docs/continuous-queries-introduction?hl=ja

### 機能
2024年8月時点で Continuous query として使える機能が指定されています。

#### 出力先
Continuous query で実行したクエリの結果は、以下3つに出力可能です。

 - BigQuery テーブル
 - Pub/Sub
 - Bigtable

#### サポートしている SQL 関数・操作
Continuous query で実行できる SQL 関数や操作が限定的です。
例えば、上記3つ以外の出力先以外への `EXPORT DATA` やサポートしている ML 関数以外の使用、外部テーブルのデータソースとしての使用などができません。
詳細はドキュメントの「サポートされているオペレーション」「制限事項」に記載があります。

https://cloud.google.com/bigquery/docs/continuous-queries-introduction?hl=ja#supported_operations

#### ロケーション（リージョン）
使用できるリージョンが決まっています。
出力先と同じリージョンにする必要があったり、後述のスロット予約時のリージョンに関係してくるため、使いたいリージョンが対応しているかの確認が必要です。

#### 料金
Continuous query はオンデマンドでの利用はできません。
事前に Enterprise エディションか Enterprise Plus エディションのスロット予約と、ジョブタイプ `CONTINUOUS` 割り当ての必要があります。
また、自動スケーリングに対応していません。

## 検証
Continuous query を手元で動かしてみました。

### スロットの予約と割り当て
先述の通り、スロットの予約とジョブタイプ `CONTINUOUS` への割り当てが必要です。
今回はマルチリージョン `US` のスロットを予約しました。
また、前述のプレビュー申し込みフォームへの申請が完了していないと、 `CONTINUOUS` への割り当てができません。
予約と割り当て方法は以下ドキュメントを参考にしました。

https://cloud.google.com/bigquery/docs/reservations-get-started?hl=ja

### Continuous query で実行したいクエリの作成
以下の動作をするクエリを作成しました。
 - words テーブルにある英単語を翻訳するように Gemini に指示を出す
 - 指示を出した結果を words_translation テーブルに格納する

``` sql
INSERT <DATASET ID>.words_translation (translation)
  SELECT
    JSON_EXTRACT_SCALAR(ml_generate_text_result, '$.candidates[0].content.parts[0].text') AS extracted_content
  FROM
    ML.GENERATE_TEXT(
      MODEL <DATASET ID>.gemini_model,
      (SELECT 
        word,
        CONCAT('次の単語を翻訳して。回答は単語だけで返答して。 ', word) AS prompt
      FROM <DATASET ID>.words),
      STRUCT(
        0.8 AS temperature,
        30 AS max_output_tokens))
```

リモートモデルの作成や `ML.GENERATE_TEXT()` 関数の使い方などは通常のクエリ実行時と同じです。

https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-create-remote-model

https://cloud.google.com/bigquery/docs/reference/standard-sql/bigqueryml-syntax-generate-text?hl=ja

### クエリモードの設定
Continuous query を実行するには、クエリタブの「:gear:展開」より「継続的クエリ」を指定します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/b72335c3-dd78-0628-7ae3-825f418a84ae.png)


指定するとクエリタブ下部でクエリモードを確認できます。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/64d7ea6e-5f2d-462a-249c-084ebb5b92ee.png)


### クエリの実行
クエリモードを設定したあと「実行」ボタンで Continuous query が始まります。
クエリタブの下部に実行時間などの詳細を確認できます。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/90885a82-19e7-2fa6-96df-79d7d1a2afb5.png)


### 動作確認
Continuous query が実行中の状態で、クエリで参照しているテーブルにレコードを INSERT すると、クエリが実行されます！
今回の場合は words テーブルに1件レコードを追加すると、words_translation テーブルに翻訳結果が格納されていることを確認できました。


以上です。
どなたかの参考になれば幸いです。