创建和管理参数化视图
您可以基于 Bigtable 中的逻辑视图创建参数化视图,然后对参数化视图执行操作。
在阅读本页内容之前,请先熟悉参数化视图概览。
准备工作
如果您计划使用 Google Cloud CLI,请按以下步骤操作:
-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
所需的角色
如需获得创建和管理参数化视图所需的权限,请让您的管理员为您授予实例的 Bigtable Admin (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 映射。
以下示例展示了如何查询名为 purchase_history_pv 的参数化视图,该视图会根据用户 ID 过滤数据。
// 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 参数,从而实现清晰的逻辑分离。