BigQueryでBigLakeテーブルを作ってみた

2024.05.09

Google Cloudデータエンジニアのはんざわです。
今回の記事では、Cloud StorageをデータストアとするBigLakeテーブルを作ってみたいと思います。

そもそもBigLakeテーブルとは?

BigLakeテーブルは、従来の外部テーブルと同様に外部のデータストアのデータにアクセス可能なテーブルです。
従来の外部テーブルと比較するとアクセス権の委任により、「ユーザーがBigLakeテーブルにアクセスする権限」「BigLakeテーブルがデータストアを参照する権限」が分離されている点で異なります。

BigLakeテーブルは、Cloud StorageにアクセスするためにBigQuery Connectionを使用します。
このConnectionには、データストアを参照する権限を割り当てることができ、これによりBigLakeテーブルへのアクセス権限とデータストアの参照権限を分離することが可能になります

また、BigLakeテーブルでサポートされているデータストアは以下の通りです。

  • Amazon S3(BigQuery Omniを使用)
  • Blob Storage(BigQuery Omniを使用)
  • Cloud Storage

BigLakeテーブルを作ってみる

以下のドキュメントを参考にしています。

サンプルデータの準備

まずは、データストアとなるCloud Storageを作成します。

gcloud storage buckets create gs://test-data-hanzawa \
    --location='us-central1'

次にBigQueryの一般公開データをCloud Storageにエクスポートします。

EXPORT DATA OPTIONS (
  uri = 'gs://test-data-hanzawa/*.json',
  format = 'JSON'
) AS
SELECT
  *
FROM
  bigquery-public-data.github_repos.files;

> 2309424945 個の行を 346 ファイルに正常にエクスポートしました。

正常にエクスポートが完了しました。

BigQuery Connectionを作成する

以下のコマンドでBigQuery Connectionを作成します。

bq --location='us-central1' mk \
  --connection \
  --connection_type=CLOUD_RESOURCE \
  biglake_test

以下のキャプチャの通り、biglake_testという名前のBigQuery Connectionを作成できました。

BigQuery Connectionを作成すると、自動でサービスアカウントが割り振られます。
今回の例だと赤枠のbqcx-868908576898-9lb9@gcp-sa-bigquery-condel.iam.gserviceaccount.comがそれに該当します。

このサービスアカウントが前述したBigLakeテーブルがデータストアを参照する役割を担います。
以下のコマンドで対象のCloud Storage単位でサービスアカウントにroles/storage.objectViewerの権限を付与します。

gcloud storage buckets add-iam-policy-binding gs://test-data-hanzawa \
  --member=serviceAccount:bqcx-868908576898-9lb9@gcp-sa-bigquery-condel.iam.gserviceaccount.com \
  --role='roles/storage.objectViewer'

これでBigQuery Connectionの準備が完了しました。

BigLakeテーブルを作成する

まずはBigQueryのデータセットを作成します。
以下のコマンドでbiglakeという名前のデータセットを作成しました。

bq --location='us-central1' mk \
    --dataset \
    biglake

次にBigLakeテーブルを作成します。
基本的には通常の外部テーブルを作成する構文と同じですが、BigLakeテーブルでは2行目のようにWITH CONNECTIONで事前に作成したBigQuery Connectionを指定します。

CREATE EXTERNAL TABLE `biglake.sample_biglake_table`
WITH CONNECTION `us-central1.biglake_test `
OPTIONS (
  format ='JSON',
  uris = ['gs://test-data-hanzawa/*']
);

以下のキャプチャのようにテーブルが作成できました。
BigLakeテーブルでは、テーブル名の右隣にBigLakeと付いているのが特徴です。

クエリを実行してみる

試しにデータの件数をカウントするクエリを実行してみます。

SELECT
  COUNT(*)
FROM
  biglake.sample_biglake_table

> 2309424945

ちゃんと実行することができました。

まとめ

今回はBigLakeテーブルを作成してみました。
現在では、従来の外部テーブルよりもBigLakeテーブルを使用することが推奨されていますので是非活用してみてください。

外部テーブルをBigLake にアップグレードする

次回の記事では、BigLakeテーブルを使用するメリットを従来の外部テーブルと比較しながら紹介したいと思います。