BigLake テーブルを作成して管理する
このドキュメントでは、BigLake テーブルの実装方法について説明します。また、このドキュメントは、データベース テーブルと権限管理を理解していることを前提としています。BigLake テーブルの全体像については、BigLake テーブルの概要をご覧ください。
準備
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
このチュートリアルでは、本番環境のワークロードに影響を与えないように、テスト プロジェクトを作成することをおすすめします。
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery Connection API.
Apache Spark などのオープンソース エンジンから BigLake テーブルを読み取る場合は、BigQuery Storage Read API を有効にする必要があります。
-
In the Google Cloud console, activate Cloud Shell.
Google Cloud SDK のバージョンが 366.0.0 以降であることを確認します。
gcloud version
必要に応じて、Google Cloud SDK を更新します。
任意: Terraform には、Terraform GCP バージョン 4.25.0 以降を使用します。HashiCorp Terraform のダウンロードから最新バージョンをダウンロードできます。
IAM の権限
BigLake テーブルを使用するには、ユーザーの組織内のロールに基づいて、次の Identity and Access Management(IAM)権限が必要です。ユーザーロールの詳細については、セキュリティ モデルをご覧ください。権限付与の詳細については、リソースに対して付与可能なロールの表示をご覧ください。
- データレイク管理者:
bigquery.connections.create
bigquery.connections.delete
bigquery.connections.list
bigquery.connections.update
- データ ウェアハウス管理者:
bigquery.tables.create
bigquery.tables.update
bigquery.connections.delegate
- データ アナリスト:
bigquery.jobs.create
bigquery.tables.get
bigquery.tables.getData
bigquery.readsessions.create
ロケーションに関する考慮事項
Cloud Storage を使用してデータファイルを保存する場合は、マルチリージョン バケットではなく最適なパフォーマンスのために、Cloud Storage のシングル リージョン バケットまたはデュアル リージョン バケットを使用することをおすすめします。
接続リソースを作成して表示する
BigLake は、接続リソースを使用してデータレイクにアクセスします。接続リソースは、プロジェクト内の単一のテーブルまたは任意のテーブルのグループに関連付けることができます。
クラウド リソース接続を作成する
次のオプションのいずれかを選択します。
コンソール
BigQuery ページに移動します。
接続を作成するには、[
データを追加] をクリックし、続いて [外部データソース] をクリックします。[接続タイプ] リストで、[BigLake とリモート関数(クラウド リソース)] を選択します。
[接続 ID] フィールドに、接続の名前を入力します。
[接続を作成] をクリックします。
[エクスプローラ] ペインで、接続リソースの作成に使用したプロジェクトの接続をクリックします。接続情報が表示されます。
後の手順で必要になるため、[接続情報] セクションの [サービス アカウント ID] をコピーします。
bq
コマンドライン環境で、接続を作成します。
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
--project_id
パラメータは、デフォルト プロジェクトをオーバーライドします。以下を置き換えます。
REGION
: 接続のリージョンPROJECT_ID
: 実際の Cloud プロジェクトの IDCONNECTION_ID
: 接続の ID
接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。
別の手順で必要になるため、そのサービス アカウント ID を取得してコピーします。
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
出力は次のようになります。
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
main.tf
ファイルに次のセクションを追加します。
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }以下を置き換えます。
CONNECTION_ID
: 接続の IDPROJECT_ID
: 実際の Cloud プロジェクトの IDREGION
: 接続のリージョン
次の接続エラーが発生した場合は、Google Cloud SDK を更新してください。
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
BigQuery AWS 接続を作成する
AWS に接続するには、BigQuery AWS 接続を作成する必要があります。接続リソースを作成すると、BigQuery は一意の ID を作成し、接続に関連付けます。
BigQuery Azure 接続を作成する
BigQuery には、Azure Blob Storage から安全にデータにアクセスするための 2 つの方法が用意されています。ID 連携の使用Google Cloud サービス アカウントに Azure アプリケーションへのアクセス権を付与するか、直接テナント内の Azure Active Directory(AD)アプリケーションへのアクセスを許可することができます。
データレイクへのアクセスを設定する
次の手順では、BigQuery がユーザーの代わりにファイルにアクセスできるように、新しい接続リソースにデータレイクへの読み取り専用アクセス権を付与します。
Cloud Storage へのアクセスを設定する
次のオプションのいずれかを選択します。
コンソール
接続リソース サービス アカウントに、ストレージ オブジェクト閲覧者 IAM ロール(roles/storage.objectViewer
)を付与することをおすすめします。これにより、サービス アカウントは Cloud Storage バケットにアクセスできるようになります。
コンソール
[IAM と管理] ページに移動
[
追加] をクリックします。[プリンシパルを追加します] ダイアログが開きます。
[新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。
[ロールを選択] フィールドで、[Cloud Storage] を選択し、続いて [Storage オブジェクト閲覧者] を選択します。
[保存] をクリックします。
gsutil
gsutil iam ch
コマンドを使用します。
gsutil iam ch MEMBER:objectViewer gs://example-bucket
MEMBER
は、以前にコピーしたサービス アカウント ID(serviceAccount:example@gcp-sa-bigquery-condel.iam.gserviceaccount.com
など)に置き換えます。
詳細については、バケットレベルのポリシーにプリンシパルを追加するをご覧ください。
Terraform
main.tf
ファイルに次のセクションを追加します。
## This grants permissions to the service account of the connection created in the last step. resource "google_project_iam_member" "connectionPermissionGrant" { project = "PROJECT_ID" role = "roles/storage.objectViewer" member = format("serviceAccount:%s", google_bigquery_connection.connection.cloud_resource[0].service_account_id) }
ユーザーを BigLake テーブルに移行した後は、Cloud Storage に直接アクセスするための権限を削除します。直接ファイル アクセスを使用すると、BigLake テーブルに設定されているガバナンス ポリシー(行レベルや列レベルのセキュリティなど)をユーザーがバイパスできるようになります。
Amazon S3 へのアクセスを設定する
S3 データにアクセスするには、AWS ロールに信頼関係を追加する必要があります。ただし、AWS アカウントにカスタム ID プロバイダがある場合は、カスタム AWS ID プロバイダを構成するの手順を行ってください。
Azure へのアクセスを設定する
Azure アプリへのアクセスを設定する手順は、Azure への接続によって異なります。ID 連携を使用して Azure に保存されているデータにアクセスする場合は、次の手順を行います。
- Azure アプリケーションに連携認証情報を追加します。
- BigQuery の Azure アプリケーションにロールを割り当てます。
連携以外の ID を使用した場合は、次の手順を行います。
BigLake テーブルを作成する
BigQuery でのテーブルの作成に詳しい場合、BigLake テーブルの作成プロセスも同様です。 テーブルは、BigLake がサポートするどのファイル形式にもできます。詳細については、制限事項をご覧ください。
Cloud Storage 用の BigLake テーブルを作成する
データセットは、BigLake テーブルを作成する前に必要です。BigLake テーブルを作成するには、次のいずれかのオプションを選択します。
コンソール
BigQuery ページに移動します。
[エクスプローラ] ペインで、テーブルを作成するデータセットを選択し、[
テーブルを作成] をクリックします。[テーブルの作成元] で、[Google Cloud Storage] を選択し、Cloud Storage バケットから外部テーブル用のデータソースを選択します。
[ファイル形式] で、ファイルと一致する形式を選択します。
[テーブル] フィールドに、テーブルの名前を入力します(例:
mytable
)。[テーブルタイプ] で、テーブルタイプを [外部テーブル] に設定します。 デフォルトでは、[クラウド リソース接続を使用して BigLake テーブルを作成する] チェックボックスが選択されています。
[接続 ID] で、以前に作成した接続を選択します。
[テーブルを作成] をクリックします。
SQL
外部の Cloud Storage テーブルに接続して BigLake テーブルを作成するには、CREATE EXTERNAL TABLE
DDL ステートメントを使用します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME` WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS ( format ="TABLE_FORMAT", uris = ['FILE_PATH']);
次のように置き換えます。
DATASET
: テーブルを作成する BigQuery データセットの名前(例:mydataset
)EXTERNAL_FILE_NAME
: 作成するテーブルの名前(例:mytable
)TABLE_FORMAT
: 作成するテーブルの形式(例:PARQUET
)FILE_PATH
: 作成する外部テーブルのデータソースへのパス(例:gs://mybucket/myfile.parquet
)
[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリの実行をご覧ください。
bq
コマンドライン環境では、--external_table_definition
パラメータの末尾で、@connection
デコレータを使用して対象の接続を指定します。
bq mk \ --table \ --external_table_definition=TABLE_FORMAT=FILE_PATH@projects/PROJECT_ID/locations/REGION/connections/CONNECTION_ID \ PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME
次のように置き換えます。
TABLE_FORMAT
: 作成するテーブルの形式(例:PARQUET
)FILE_PATH
: 作成する外部テーブルのデータソースへのパス(例:gs://mybucket/myfile.parquet
)DATASET
: テーブルを作成する BigQuery データセットの名前(例:mydataset
)EXTERNAL_TABLE_NAME
: 作成するテーブルの名前(例:mytable
)
Terraform
main.tf
ファイルに次のセクションを追加します。スキーマの自動検出を使用する場合は、次のセクションの関連する行のコメントを解除します。
## This creates a dataset for your table. resource "google_bigquery_dataset" "dataset" { provider = google project = "PROJECT_ID" dataset_id = "DATASET" location = "REGION" }
## If you are using schema autodetect, uncomment the following to set up ## a delay to give IAM changes time to propagate. #resource "time_sleep" "wait_7_min" { #depends_on = [google_project_iam_member.connectionPermissionGrant] #create_duration = "7m" #}
## This creates a table using the connection id. resource "google_bigquery_table" "biglakeTable" { ## If you are using schema autodetect, uncomment the following to ## set up a dependency on the prior delay. # depends_on = [time_sleep.wait_7_min] dataset_id = google_bigquery_dataset.dataset.dataset_id table_id = "EXTERNAL_TABLE_NAME" project = "PROJECT_ID" schema = <<EOF [ { "name": "country", "type": "STRING" }, { "name": "product", "type": "STRING" }, { "name": "price", "type": "INT64" } ] EOF external_data_configuration { ## Autodetect determines whether schema autodetect is active or inactive. autodetect = AUTODETECT_BOOLEAN source_format = "PARQUET" connection_id = google_bigquery_connection.connection.name source_uris = [ "gs://huron-userguide-demo/orders/*.parquet", ] } deletion_protection = false }
次のように置き換えます。
DATASET
: テーブルを作成する BigQuery データセットの名前(例:mydataset
)EXTERNAL_TABLE_NAME
: 作成するテーブルの名前(例:mytable
)AUTODETECT_BOOLEAN
: プロジェクトでスキーマの自動検出を使用しているかどうか(true または false など)を定義する
BigLake はスキーマの自動検出をサポートしています。ただし、スキーマを提供せず、前の手順でサービス アカウントに付与されていない場合、スキーマを自動検出しようとすると、アクセス拒否メッセージで失敗します。
Amazon S3 用の BigLake テーブルを作成する
S3 に保存されているデータにアクセスするには、外部テーブルが必要です。Amazon S3 用の BigLake テーブルを作成するには、Amazon S3 データ用の外部テーブルを作成するの手順を行います。
Azure 用の BigLake テーブルを作成する
Azure ストレージに保存されているデータにアクセスするには、外部テーブルが必要です。Azure ストレージ用の BigLake テーブルを作成するには、Azure Storage データ用の外部テーブルを作成するの手順を行います。
外部テーブルを BigLake テーブルにアップグレードする
外部テーブルを Cloud リソース接続に関連付けることで、外部テーブルを BigLake テーブルにアップグレードできます。フラグと引数の完全なリストについては、リファレンス トピックの bq update
と bq mkdef
をご覧ください。
BigLake がサポートする任意のソース形式を使用できます。詳細については、制限事項をご覧ください。
外部テーブルを BigLake テーブルに更新するには、次のいずれかのオプションを選択します。
SQL
次の例では、CREATE OR REPLACE EXTERNAL TABLE
DDL ステートメントを使用して、外部テーブルを Cloud リソース接続に関連付けることで、外部テーブルを BigLake テーブルにアップグレードします。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
CREATE OR REPLACE EXTERNAL TABLE `EXTERNAL_TABLE_NAME` WITH CONNECTION `CONNECTION_ID` OPTIONS( format="TABLE_FORMAT", uris="[FILE_PATH]" )
次のように置き換えます。
DATASET
: テーブルを作成する BigQuery データセットの名前(例:mydataset
)EXTERNAL_FILE_NAME
: 作成するテーブルの名前(例:mytable
)TABLE_FORMAT
: 作成するテーブルの形式(例:PARQUET
)FILE_PATH
: 作成する外部テーブルのデータソースへのパス(例:gs://mybucket/myfile.parquet
)
[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリの実行をご覧ください。
bq
使用する接続を指定する新しい外部テーブル定義を作成します。
bq mkdef --connection_id=PROJECT_ID.REGION.CONNECTION_ID \ --source_format=TABLE_FORMAT \ "FILE_PATH" > /tmp/DEFINITION_FILE
DEFINITION_FILE
は、作成するテーブル定義ファイルの名前で置き換えます(例:tabledefinition.json
)。新しい外部テーブルの定義を使用してテーブルを更新します。
bq update --external_table_definition=/tmp/DEFINITION_FILE PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME
アクセス制御ポリシーを設定する
BigLake テーブルのアクセス制御ポリシーを作成するには、まず Data Catalog でポリシータグの分類階層を作成します。次に、ポリシータグを機密性の高い行または列に適用します。
列レベルのセキュリティの設定方法については、列レベルのセキュリティ ガイドをご覧ください。
BigLake の列レベルのアクセス制御ポリシーを定義するワークフローは、BigQuery マネージド テーブルのワークフローと同じです。
行レベルのセキュリティの設定方法については、行レベルのセキュリティ ガイドをご覧ください。
たとえば、データセット mydataset
内のテーブル mytable
に対する行アクセスを制限するとします。
+---------+---------+-------+ | country | product | price | +---------+---------+-------+ | US | phone | 100 | | JP | tablet | 300 | | UK | laptop | 200 | +---------+---------+-------+
Kim(kim@example.com
)用に行レベルのフィルタを作成して、アクセス権を country
が US
の行だけに制限できます。
CREATE ROW ACCESS POLICY only_us_filter ON mydataset.mytable GRANT TO ('user:kim@example.com') FILTER USING (country = 'US');
次に、Kim が次のクエリを実行すると:
SELECT * FROM projectid.mydataset.mytable;
出力には、country
が US
の行のみが表示されます。
+---------+---------+-------+ | country | product | price | +---------+---------+-------+ | US | phone | 100 | +---------+---------+-------+
BigQuery を使用し BigLake テーブルに対してクエリを実行する
クエリを送信には、どの BigQuery クライアントも使用できます。bq
コマンドライン ツールを使用する場合は、--nouse_legacy_sql
フラグか --use_legacy_sql=false
フラグを使用して標準 SQL 構文を指定し query
コマンドを使用します。次に例を示します。
bq query --nouse_legacy_sql "SELECT * FROM PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME;"
コネクタを使用して BigLake テーブルに対してクエリを実行する
Cloud Storage 上の BigLake テーブルには、BigQuery 以外のデータ処理ツールを使用してアクセスできます。たとえば、BigQuery コネクタを使うことで、Apache Spark、Trino、Apache Hive を使用できます。BigQuery Storage API により、Cloud Storage や BigQuery のすべての BigLake テーブルに行レベルと列レベルのガバナンス ポリシーが適用されます。
Spark
次の例では Dataproc を使用していますが、Spark BigQuery コネクタを使用する Spark デプロイメントでも動作します。
この例では、クラスタを作成するときに、初期化アクションとして Spark BigQuery コネクタを指定します。このアクションでは、Zeppelin ノートブックを使用して、データ アナリスト ユーザーの行動を実行できます。
Spark BigQuery コネクタの初期化アクションを使用して、単一ノードのクラスタを作成します。
gcloud dataproc clusters create biglake-demo-cluster \ --optional-components=ZEPPELIN \ --region=REGION \ --enable-component-gateway \ --single-node \ --initialization-actions gs://goog-dataproc-initialization-actions-us-central1/connectors/connectors.sh \ --metadata bigquery-connector-url=gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar \ --metadata spark-bigquery-connector-url=gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar
Dataflow
Dataflow から BigLake テーブルを読み取るには、DIRECT_READ
モードで Dataflow コネクタを使用して、BigQuery Storage API を使います。クエリ文字列からの読み取りもサポートされています。Apache Beam ドキュメントの BigQuery I/O をご覧ください。
監査ロギング
BigQuery のロギングについては、BigQuery モニタリングの概要をご覧ください。Google Cloud のロギングの詳細については、Cloud Logging をご覧ください。