【新機能】BigQueryのオブジェクト テーブルを使ってみる(プレビュー)

BigQueryのオブジェクト テーブル(Object Tables)を使って、 Google Cloud Storage(GCS)上のファイルのメタデータを参照する。
2022.12.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

BigQuery Advent Calendar 2022 の23日目の記事です。

データアナリティクス事業本部、池田です。
先月 プレビュー となりました、BigQueryオブジェクト テーブルObject Tables)を使ってみます。

BigQuery release notes > November 17, 2022

Google Cloud Storage(以下GCS)上のファイルのメタデータを参照できる外部テーブルを作成できます。
公式のガイドの オブジェクト テーブルの概要 によると、

他の BigQuery テーブルと同じ方法で、オブジェクト テーブルのメタデータをクエリできます。ただし、オブジェクト テーブルの主な用途は、分析用に非構造化データにアクセスできるようにすることです。

とのことです。

実際に画像推論と絡めての活用方法は、以下の動画が分かりやすかったです。
Next '22 の Vertex AI 新情報ふりかえり

執筆時点(2022/12)では 制限事項 がいくつかありますが、BigQureyの定額料金でしか使えません。
(Flex slotsの定額料金を設定する方法は 以前ブログ にしています。)

この機能は、執筆時点(2022/12)では申請が必要なプレビューとなります。 フォームからの申請が必要でしたが、 私の場合は2022/11/18に簡単な入力で申請をして、 2022/12/06には承認メールが届き利用できました。

クラウド リソース接続の作成

※以降の操作は、プロジェクトのオーナー権限を持つアカウントで、 コマンドはCloud Shell、 SQLはBigQueryのコンソールで実行しています。

クラウド リソースタイプの接続Cloud resource connections)を作成します。

bq mk --connection --location=us-east1 \
--connection_type=CLOUD_RESOURCE obj-tbls-conn

GCSバケットを us-east1 で作成していたので、同じリージョンで作成しました。 (リージョンが異なると後でエラーになります。後述。)

リージョンに関しては、 公式のガイド によると、

Location consideration

When you use Cloud Storage to store data files, we recommend that you use Cloud Storage single-region or dual-region buckets for optimal performance, not multi-region buckets.

とのことなので、パフォーマンス面では US などマルチリージョンは避けた方が良いようです。

↓作成後のコンソールはこんな感じ。

この後使うので、サービスアカウントを控えておきます。

権限付与

接続が使用するサービスアカウントに対して、バケット内の参照権限を付与します。

gsutil iam ch serviceAccount:{接続のサービスアカウント}:objectViewer gs://{バケット名}

オブジェクト テーブルの作成

まずはテーブルを配置するデータセットを作成します。

CREATE SCHEMA my_obj_tbls
OPTIONS(
    location = 'us-east1'
);

外部テーブルを作成するような感じで、 オブジェクト テーブルを作成 します。
↓CSVが入ったGCSパスを指定したもの。

CREATE EXTERNAL TABLE my_obj_tbls.csv_sample
WITH CONNECTION `us-east1.obj-tbls-conn`
OPTIONS(
    object_metadata = 'SIMPLE',
    uris = ['gs://{バケット名}/inputs/*']
);

オブジェクト テーブルは非構造化データと絡めて話をされていることが多いですが、 メタデータを参照するだけであれば構造化データでもよいかと思い、 なんとなくCSVを読ませてみました。

↓画像ファイルが入ったGCSパスを指定したもの。

CREATE EXTERNAL TABLE my_obj_tbls.img_sample
WITH CONNECTION `us-east1.obj-tbls-conn`
OPTIONS(
    object_metadata = 'SIMPLE',
    uris = ['gs://{バケット名}/inputs_img/*']
);

ちなみにGCSバケットと、接続・データセットのリージョンが異なると以下のようなエラーでテーブルが作成できません。
Cannot read and write in different locations: source: us-east1, destination: US

接続とデータセットのリージョンが異なってもダメでした。
Not found: Dataset {プロジェクト名}:my_obj_tbls was not found in location US
なので、バケットと同じリージョンで接続とデータセットを作成しておく必要があるようです。

↓作成後のスキーマ

オブジェクト テーブルを参照してみる

作成したオブジェクト テーブルを参照してみます。

ちなみにここで定額料金を設定していないと、以下のエラーになりました。
Object tables only support flat rate pricing through reservations.

SELECT * FROM my_obj_tbls.csv_sample LIMIT 1000;

CSV(構造化データ)でもメタデータは参照できました。

SELECT * FROM my_obj_tbls.img_sample LIMIT 1000;

もちろん画像も大丈夫!

おわりに

おそらくこの機能を単独で使うことはあまりなく、 画像系の機械学習 などと絡めて使っていくことになるかと思います。

署名付きURLの発行 ができるらしいので、そっちも試したかったのですが、 アドベントカレンダーの締め切りがあるのであきらめました。たぶん次回。

関連情報/参考にさせていただいたページ