创建和管理 BigLake 表

本文档介绍如何实现 BigLake 表,并假定您熟悉数据库表和权限管理。如需大致了解 BigLake 表,请参阅 BigLake 表简介

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

    在本教程中,我们建议您创建一个测试项目,以确保您的生产工作负载不受影响。

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 BigQuery Connection API。

    启用 API

    如果要从 Apache Spark 等开源引擎读取 BigLake 表,则需要启用 BigQuery Storage Read API

  4. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  5. 确保您的 Google Cloud SDK 为 366.0.0 版或更高版本:

    gcloud version
    

    如有需要,请更新 Google Cloud SDK

  6. 可选:对于 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 资源连接

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 如需创建连接,请点击 添加数据,然后点击外部数据源

  3. 连接类型列表中,选择 BigLake 和远程函数(Cloud 资源)

  4. 连接 ID 字段中,输入连接的名称。

  5. 点击创建连接

  6. 探索器窗格中,点击项目中您用于创建连接资源的连接。系统随即会显示连接信息:

    查看连接信息。

  7. 连接信息部分中,复制服务帐号 ID,因为您需要在后续步骤中用到它。

bq

  1. 在命令行环境中,创建连接:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID
    

    --project_id 参数会替换默认项目。

    替换以下内容:

    • REGION:您的连接区域
    • PROJECT_ID:您的 Cloud 项目 ID
    • CONNECTION_ID:您的连接的 ID

    当您创建连接资源时,BigQuery 会创建一个唯一的系统服务帐号,并将其与该连接相关联。

  2. 检索并复制该服务帐号 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:您的连接的 ID
  • PROJECT_ID:您的 Cloud 项目 ID
  • REGION:您的连接区域

如果您收到以下连接错误,请更新 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 存储桶。

控制台

  1. 前往 IAM 和管理页面。

    转到“IAM 和管理”

  2. 点击 Add

    系统随即会打开添加主帐号对话框。

  3. 新的主帐号字段中,输入您之前复制的服务帐号 ID。

  4. 选择角色字段中,选择 Cloud Storage,然后选择 Storage Object Viewer

  5. 点击保存

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 中的数据,请按照以下步骤操作:

  1. 将联合凭据添加到 Azure 应用。
  2. 为 BigQuery 的 Azure 应用分配角色

如果您使用的是非联合身份,请按以下步骤操作:

  1. 创建 Azure AD 服务主帐号
  2. 为 BigQuery 的 Azure AD 应用分配角色

创建 BigLake 表

如果您熟悉在 BigQuery 中创建表的过程,则创建 BigLake 表的过程类似。 您的表可以采用 BigLake 支持的任何文件格式。如需了解详情,请参阅限制

为 Cloud Storage 创建 BigLake 表

创建 BigLake 表之前,您需要拥有一个数据集。如需创建 BigLake 表,请选择以下选项之一:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 探索器窗格中,选择要在其中创建表的数据集,然后点击 创建表

  3. 基于以下数据创建表部分,选择 Google Cloud Storage,然后从 Cloud Storage 存储桶中选择外部表的数据源。

  4. 文件格式部分,选择与您的文件匹配的格式。

  5. 字段中,输入表的名称,例如 mytable

  6. 表类型部分,将表类型设置为外部表。 默认情况下,使用 Cloud 资源连接来创建 BigLake 表复选框处于选中状态。

  7. 连接 ID 部分,选择您之前创建的连接。

  8. 点击创建表

SQL

如需通过连接到外部 Cloud Storage 表来创建 BigLake 表,请使用 CREATE EXTERNAL TABLE DDL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    进入 BigQuery

  2. 在查询编辑器中,输入以下语句:

    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

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

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 updatebq mkdef

您可以使用 BigLake 支持的任何来源格式。如需了解详情,请参阅限制

如需将外部表更新为 BigLake 表,请选择以下选项之一:

SQL

以下示例使用 CREATE OR REPLACE EXTERNAL TABLE DDL 语句将外部表关联到 Cloud 资源连接,从而将外部表升级为 BigLake 表:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    进入 BigQuery

  2. 在查询编辑器中,输入以下语句:

    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

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 生成新的外部表定义,以指定要使用的连接:

    bq mkdef --connection_id=PROJECT_ID.REGION.CONNECTION_ID \
      --source_format=TABLE_FORMAT \
      "FILE_PATH" > /tmp/DEFINITION_FILE
    

    DEFINITION_FILE 替换为您要创建的表定义文件的名称,例如 tabledefinition.json

  2. 使用新的外部表定义更新表:

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) 创建行级过滤条件,限制其仅可访问 countryUS 的行。

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;

输出将仅显示 countryUS 的行:

+---------+---------+-------+
| 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 SparkTrinoApache 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