パラメータ化されたビューを作成して管理する
Bigtable の論理ビューからパラメータ化されたビューを作成し、パラメータ化されたビューに対してオペレーションを実行できます。
このページを読む前に、 パラメータ化されたビューの概要を理解しておいてください。
始める前に
Google Cloud CLI を使用する場合は、次の手順を行います。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init
必要なロール
パラメータ化されたビューの作成と管理に必要な権限を取得するには、インスタンスに対する Bigtable 管理者(roles/bigtable.admin)ロールを付与するよう管理者に依頼してください。
または、インスタンス レベルで次の権限をリクエストすることもできます。
- 作成:
bigtable.logicalViews.create - 更新:
bigtable.logicalViews.update - 削除:
bigtable.logicalViews.delete - リスト:
bigtable.logicalViews.list
パラメータ化されたビューを作成するには、ソーステーブルに対する bigtable.tables.readRows 権限も必要です。
パラメータ化されたビューを作成する
パラメータ化されたビューは、SQL SELECT ステートメントによって定義される仮想テーブルです。このステートメントには VIEW_PARAMETERS() 関数を含めることができます。
パラメータ化されたビューを作成するには、
gcloud bigtable logical-views create
コマンドを使用します。
gcloud bigtable logical-views create VIEW \
--instance=INSTANCE \
--query="SELECT * FROM TABLE_ID WHERE STARTS_WITH(_key, CAST(VIEW_PARAMETERS('VIEW_PARAMETERS') AS BYTES))"
次のように置き換えます。
VIEW: 新しいパラメータ化されたビューの ID(最大 128 文字)。ID は、インスタンス内のテーブル ID とビュー ID の間で一意である必要があります。INSTANCE: パラメータ化されたビューを作成するインスタンスの ID。TABLE_ID: ソーステーブルの ID。VIEW_PARAMETERS:VIEW_PARAMETERS()関数に引数として渡す、ビューのパラメータの名前(一重引用符で囲みます) 。
オプション:
- パラメータ化されたビューが削除されないようにするには、コマンドに
--deletion-protectionフラグを追加します。この設定を適用しない場合、ビューは削除される可能性があります。--no-deletion-protectionを追加して、ビューの削除を明示的に許可することもできます。詳細については、このドキュメントの パラメータ化されたビューを更新するをご覧ください。
構造化された行キーを使用してパラメータ化されたビューを作成する
テーブルで構造化された行キーを使用している場合は、 行キーの特定のセグメントでフィルタできます。
たとえば、購入履歴テーブルの行キーに、ユーザー、購入日のタイムスタンプ、注文 ID が # 記号で区切られて保存されている場合は、次のように行スキーマを指定できます。
field {
field_name: "user_id"
type: { bytesType { encoding { raw {} } } }
}
field {
field_name: "reversed_timestamp"
type: { timestampType { encoding { unixMicrosInt64 { encoding: { orderedCodeBytes: {} } } } } }
}
field {
field_name: "order_id"
type: { stringType { encoding { utf8Bytes {} } } }
}
encoding {
delimitedBytes { delimiter "#" }
}
次に、ユーザー ID フィールドでフィルタするビューを作成できます。
gcloud bigtable logical-views create VIEW \
--instance=INSTANCE \
--query="SELECT * FROM TABLE_ID WHERE user_id = CAST(VIEW_PARAMETERS('user_id') AS BYTES)"
次のように置き換えます。
VIEW: 新しい パラメータ化されたビューの ID(最大 128 文字)。ID は、インスタンス内のテーブル ID とビュー ID の間で一意である必要があります。INSTANCE: パラメータ化されたビューを作成するインスタンスの ID。TABLE_ID: ソーステーブルの ID。
パラメータ化されたビューを更新する
パラメータ化されたビューは、論理ビューを更新するのと同じ方法で 更新します。
パラメータ化されたビューを削除する
パラメータ化されたビューは、論理ビューを削除するのと同じ方法で 削除します。
パラメータ化されたビューに関する情報を表示する
パラメータ化されたビューのリストは、 インスタンスの論理ビューのリストを表示するのと同じ方法で表示します。
パラメータ化されたビューに対するクエリを実行する
パラメータ化されたビューに対するクエリは、通常のテーブルと同様に実行しますが、リクエストで view_parameters マップを指定します。
次の例は、ユーザー ID に基づいてデータをフィルタする purchase_history_pv という名前のパラメータ化されたビューに対してクエリを実行する方法を示しています。
// Assumes 'purchase_history_pv' was created with the definition:
// SELECT * FROM purchases WHERE user_id = CAST(VIEW_PARAMETERS('user_id') AS BYTES)
String query = "SELECT customer_info[email], order_details[status], order_info[items] from purchase_history_pv";
PreparedStatement preparedStatement = dataClient.prepareStatement(query);
BoundStatement boundStatement = preparedStatement.bind().build();
// The user ID is now passed out-of-band in a view parameters map.
Map<String, Value> viewParameters = new HashMap<>();
viewParameters.put("user_id", Value.newBuilder().setType(stringType()).setStringValue(userId).build());
// Execute the query, passing the view parameters using a proto field in the request.
ResultSet rs = dataClient.executeQuery(
boundStatement,
viewParameters
);
これにより、ユーザーはクエリ自体の中で user_id パラメータを表示または操作できなくなり、明確な論理分離が実現します。