创建和管理 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 使用连接资源来访问数据湖。您可以将连接资源与单个表或项目中的任意一组表相关联。
创建 Cloud 资源连接
从下列选项中选择一项:
控制台
转到 BigQuery 页面。
如需创建连接,请点击
添加数据,然后点击外部数据源。在连接类型列表中,选择 BigLake 和远程函数(Cloud 资源)。
在连接 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 安全访问数据的方法。您可以通过向 Google Cloud 服务帐号授予对 Azure 应用的访问权限来使用身份联合,也可以直接向租户中的 Azure Active Directory (AD) 应用授予访问权限。
设置对数据湖的访问权限
在以下步骤中,您将向新的连接资源授予对数据湖的只读权限,以便 BigQuery 能够代表用户访问文件。
设置对 Cloud Storage 的访问权限
从下列选项中选择一项:
控制台
我们建议您向连接资源服务帐号授予 Storage Object Viewer IAM 角色 (roles/storage.objectViewer
),该角色允许服务帐号访问 Cloud Storage 存储桶。
控制台
前往 IAM 和管理页面。
点击
Add。系统随即会打开添加主帐号对话框。
在新的主帐号字段中,输入您之前复制的服务帐号 ID。
在选择角色字段中,选择 Cloud Storage,然后选择 Storage Object Viewer。
点击保存。
gsutil
使用 gsutil iam ch
命令:
gsutil iam ch serviceAccount:MEMBER:objectViewer gs://example-bucket
将 MEMBER
替换为您之前复制的服务帐号 ID,例如 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 帐号具有自定义身份提供商,请按照配置自定义 AWS 身份提供商中的说明操作。
设置对 Azure 的访问权限
根据您连接到 Azure 的方式,用于设置对 Azure 应用的访问权限的步骤也会有所不同。如果您使用身份联合访问存储在 Azure 中的数据,请按照以下步骤操作:
- 将联合凭据添加到 Azure 应用。
- 为 BigQuery 的 Azure 应用分配角色。
如果您使用的是非联合身份,请按以下步骤操作:
创建 BigLake 表
如果您熟悉在 BigQuery 中创建表的过程,则创建 BigLake 表的过程类似。 您的表可以采用 BigLake 支持的任何文件格式。如需了解详情,请参阅限制。
为 Cloud Storage 创建 BigLake 表
创建 BigLake 表之前,您需要拥有一个数据集。如需创建 BigLake 表,请选择以下选项之一:
控制台
转到 BigQuery 页面。
在探索器窗格中,选择要在其中创建表的数据集,然后点击
创建表。在基于以下数据创建表部分,选择 Google Cloud Storage,然后从 Cloud Storage 存储桶中选择外部表的数据源。
在文件格式部分,选择与您的文件匹配的格式。
在表字段中,输入表的名称,例如
mytable
。在表类型部分,将表类型设置为外部表。 默认情况下,使用 Cloud 资源连接来创建 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
在命令行环境中,使用 @connection
修饰器指定要在 --external_table_definition
参数末尾使用的连接:
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 Storage 中的数据,您需要有一个外部表。如需为 Azure Storage 创建 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
命令行工具,请使用 query
命令并通过 --nouse_legacy_sql
或 --use_legacy_sql=false
标志指定 Google 标准 SQL 语法。例如:
bq query --nouse_legacy_sql "SELECT * FROM PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME;"
使用连接器查询 BigLake 表
您也可以使用 BigQuery 之外的其他数据处理工具来访问 Cloud Storage 上的 BigLake 表。例如,通过 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。