【新機能】BigQueryのオブジェクト テーブルを使ってみる(プレビュー)
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の発行 ができるらしいので、そっちも試したかったのですが、 アドベントカレンダーの締め切りがあるのであきらめました。たぶん次回。