BigQuery で非構造化データを扱う新機能 ObjectRef 型を使ってみた
データ事業本部のはんざわです。
Google Cloud Next '25 で、BigQuery で構造化データと非構造化データをより柔軟に扱える「マルチモーダルテーブル」と「ObjectRef 型」が発表されました。
本記事では、ObjectRef 型の概要を簡単にご紹介し、この新機能によってどのようなことが可能になるのかを紹介します。
以下の公式ブログは非常に参考になると思うので、ぜひ参考にしてください。
オブジェクトテーブルのおさらい
BigQuery で非構造化データを扱う方法として、「オブジェクトテーブル」がありました。
オブジェクトテーブルを利用することで、Cloud Storage 上に保存された画像や動画などの非構造化データを BigQuery から直接参照できるようになります。
メタデータ(ファイル名、サイズなど)を構造化データとして管理しつつ、コンテンツ本体を BigQuery ML などの分析・機械学習ワークフローに組み込むことが可能です。
以下の図は、その構成イメージです。
オブジェクトテーブルの問題点
一見便利なオブジェクトテーブルですが、構造化テーブルと組み合わせづらいという課題がありました。
オブジェクトテーブルを通常の構造化テーブルと結合すると、非構造化データの参照情報が失われ、BigQuery からファイルの中身にアクセスできなくなります。
具体的なイメージとして、以下の図のような状態です。
このように従来のオブジェクトテーブルでは、非構造化データと構造化データを結合し、その両方を活用することが困難でした。
この問題を解決するのが、冒頭でも紹介した ObjectRef 型 です。
ObjectRef 型とは?
構造化データと非構造化データを統合して扱うために、BigQuery に新たに導入されたのが ObjectRef 型 です。
これにより、非構造化データを構造化テーブル内の 1 カラムとして扱うことが可能になります。
ObjectRef 型の実態は、以下のような構造を持つ STRUCT 型として定義されています。
struct {
uri string,
version string,
authorizer string,
details json {
gcs_metadata json {
"content_type": string,
"md5_hash": string,
"size": number,
"updated": number
}
}
}
この ObjectRef 型は、既存のオブジェクトテーブルにも ref
カラムとして追加されています。
以下はオブジェクトテーブルのスキーマ一覧ですが、一番下に ref
カラムが追加されているのが確認できます。
さらに、ObjectRef 型には専用の関数がいくつか用意されており、その中のひとつが OBJ.GET_ACCESS_URL
です。
この関数に ObjectRef 型の値を渡すと、ObjectRefRuntime
という一時的なオブジェクトが返されます。
この中には、Cloud Storage 上のファイルにアクセスするための有効期限付き URL が含まれています。
これにより、従来は結合によって失われていた参照情報が保持され、構造化データと非構造化データを結合した後でも Cloud Storage 上のオブジェクトにアクセスできるようになります。
以下の図は、その構成イメージです。
ObjectRef 型を試してみる
ここでは、ObjectRef 型を使って BigQuery 上で非構造化データ(画像)を扱い、AI モデルを活用して推論・検証を行ってみます。
検証内容
- Cloud Storage に保存されている画像に何が写っているかを AI モデルに推論させる
- 推論結果が正しいかどうかを、再度 AI モデルに確認させる
事前準備
まず、Cloud Storage に果物の画像を 3 つアップロードします。
gcloud storage cp ./fruit_peach.png gs://cm-hanzawa-images/fruits/
gcloud storage cp ./fruit_banana.png gs://cm-hanzawa-images/fruits/
gcloud storage cp ./fruit_apple.png gs://cm-hanzawa-images/fruits/
次に、オブジェクトテーブルを作成します。
コネクションの作成や権限付与などの詳細は省略し、以下のクエリで作成しました。
CREATE EXTERNAL TABLE test.fruits
WITH CONNECTION `us-central1.object-tables-connection`
OPTIONS(
object_metadata = 'SIMPLE',
uris = ['gs://cm-hanzawa-images/fruits/*']
);
続いて、Vertex AI の Gemini モデルを使うためのリモートモデルを作成します。
こちらも詳細な手順は省略しますが、以下のクエリで gemini-2.0-flash
モデルを定義しています。
CREATE OR REPLACE MODEL `bqml.gemini`
REMOTE WITH CONNECTION `us-central1.vertex-ai-connection`
OPTIONS (
ENDPOINT = 'gemini-2.0-flash'
);
具体的な作成手順は以下のブログを参考にしてます。
推論してみる
まず、オブジェクトテーブルと AI モデルによる推論結果を結合したテーブルを作成します。
CREATE OR REPLACE TABLE test.fruits_joined AS (
SELECT
obj.ref AS ref,
result.output AS output
FROM
test.fruits AS obj
LEFT JOIN
(
SELECT
uri,
STRING(ml_generate_text_result.candidates[0].content.parts[0].text) AS output
FROM
ML.GENERATE_TEXT(
MODEL `bqml.gemini`,
TABLE `test.fruits`,
STRUCT (
'画像に写ってる果物は何ですか?日本語で名称を簡潔に答えてください。' AS PROMPT
)
)
) AS result
ON obj.uri = result.uri
);
生成されたテーブルは以下のような形式になります。
次に、画像の内容と推論結果が一致しているかどうかを、AI に確認してもらいます。
SELECT
output,
ref.uri AS uri,
AI.GENERATE_BOOL(
prompt => ("元の画像ファイルと推測結果を比較し、結果が正しい確認してください。元の画像は", OBJ.GET_ACCESS_URL(ref, "r"), "で、推測結果は", output, "です。"),
connection_id => "us-central1.object-tables-connection",
endpoint => "gemini-2.5-flash"
).result
FROM
test.fruits_joined
以下は実行結果のスクリーンショットです。
画像が「桃」で、推論結果が「さくらんぼ」となっている行だけ false となり、それ以外は true となっています。
感想
本記事では、BigQuery の新機能である「マルチモーダルテーブル」と「ObjectRef 型」について簡単にご紹介しました。
これらの機能により、Cloud Storage 上の非構造化データを構造化データと統合し、AI モデルと連携した柔軟な分析やモデリングが可能になります。
非構造化データを活用した AI 活用やデータ分析のニーズがある場合には、ぜひ本機能の活用を検討してみてはいかがでしょうか。
おまけ
「推論してみる」のパートでは、オブジェクトテーブルと AI モデルによる推論結果を結合したテーブルを作成しました。
その際は、オブジェクトテーブルをリモートモデルの入力として参照する形でクエリを記述していました。
しかし、ObjectRef 型を活用することで、別の書き方も可能です。
以下のように、OBJ.GET_ACCESS_URL()
を使って画像の URL を取得し、そのまま AI.GENERATE()
関数に渡すことで、よりシンプルに記述できます。
SELECT
ref.uri AS uri,
AI.GENERATE(
prompt => (OBJ.GET_ACCESS_URL(ref, "r"), "の画像に写っている果物を日本語で簡潔に答えてください。"),
connection_id => "us-central1.object-tables-connection",
endpoint => "gemini-2.5-flash"
).result
FROM
test.fruits
個人的には、面白い書き方だなと思っています。参考になれば幸いです。