BigQuery Continuous query を試す!
はじめに
この記事は 2024年8月28日に行われた color is【クラウドLT大会vol.10】の発表内容をもとに作成しております。
2024年4月で行われた Google Cloud Next '24 にて発表された Continuous query が8月にプレビューとなりました
この記事では機能の詳細や検証などをまとめます。
Continuous query とは
概要
Continuous query を使うことによって、BigQuery にデータが書き込まれたタイミングでのクエリ実行が可能になり、リアルタイムデータに対する分析ができるようになりました。
また Continuous query プレビューと同じタイミングで BigQuery から Pub/Sub と Bigtable へのエクスポートもプレビューとなったため、他アプリケーションやサービスへの連携がさらに容易になりました。
使い始めるには
2024年8月時点、Continuous query を使うにはプレビュー申し込みフォームより申請が必要です。
ドキュメント上部にフォームのリンクが公開されています。
機能
2024年8月時点で Continuous query として使える機能が指定されています。
出力先
Continuous query で実行したクエリの結果は、以下3つに出力可能です。
- BigQuery テーブル
- Pub/Sub
- Bigtable
サポートしている SQL 関数・操作
Continuous query で実行できる SQL 関数や操作が限定的です。
例えば、上記3つ以外の出力先以外への EXPORT DATA
やサポートしている ML 関数以外の使用、外部テーブルのデータソースとしての使用などができません。
詳細はドキュメントの「サポートされているオペレーション」「制限事項」に記載があります。
ロケーション(リージョン)
使用できるリージョンが決まっています。
出力先と同じリージョンにする必要があったり、後述のスロット予約時のリージョンに関係してくるため、使いたいリージョンが対応しているかの確認が必要です。
料金
Continuous query はオンデマンドでの利用はできません。
事前に Enterprise エディションか Enterprise Plus エディションのスロット予約と、ジョブタイプ CONTINUOUS
割り当ての必要があります。
また、自動スケーリングに対応していません。
検証
Continuous query を手元で動かしてみました。
スロットの予約と割り当て
先述の通り、スロットの予約とジョブタイプ CONTINUOUS
への割り当てが必要です。
今回はマルチリージョン US
のスロットを予約しました。
また、前述のプレビュー申し込みフォームへの申請が完了していないと、 CONTINUOUS
への割り当てができません。
予約と割り当て方法は以下ドキュメントを参考にしました。
Continuous query で実行したいクエリの作成
以下の動作をするクエリを作成しました。
- words テーブルにある英単語を翻訳するように Gemini に指示を出す
- 指示を出した結果を words_translation テーブルに格納する
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()
関数の使い方などは通常のクエリ実行時と同じです。
クエリモードの設定
Continuous query を実行するには、クエリタブの「展開」より「継続的クエリ」を指定します。
クエリの実行
クエリモードを設定したあと「実行」ボタンで Continuous query が始まります。
クエリタブの下部に実行時間などの詳細を確認できます。
動作確認
Continuous query が実行中の状態で、クエリで参照しているテーブルにレコードを INSERT すると、クエリが実行されます!
今回の場合は words テーブルに1件レコードを追加すると、words_translation テーブルに翻訳結果が格納されていることを確認できました。
以上です。
どなたかの参考になれば幸いです。