创建 AWS Glue 联合数据集

本文档介绍如何在 BigQuery 中创建与 AWS Glue 中的现有数据库关联的联合数据集。

联合数据集是 BigQuery 与外部数据源之间在数据集级层的连接。系统会根据相应的外部数据源中的表自动填充联合数据集中的表。您可以直接在 BigQuery 中查询这些表,但无法执行修改、添加或删除操作。但是,您在外部数据源中进行的任何更新都会自动反映在 BigQuery 中。

须知事项

确保您有可以访问 AWS Glue 数据的连接。

  • 如需创建或修改连接,请按照连接到 Amazon S3 中的说明操作。创建该连接时,请在 BigQuery 的 AWS Identity and Access Management 政策中添加以下 AWS Glue 政策语句。除了在存储 AWS Glue 表中数据的 Amazon S3 存储桶上设置其他权限之外,还应添加此语句。

    {
     "Effect": "Allow",
     "Action": [
       "glue:GetDatabase",
       "glue:GetTable",
       "glue:GetTables",
       "glue:GetPartitions"
     ],
     "Resource": [
       "arn:aws:glue:REGION:ACCOUNT_ID:catalog",
       "arn:aws:glue:REGION:ACCOUNT_ID:database/DATABASE_NAME",
       "arn:aws:glue:REGION:ACCOUNT_ID:table/DATABASE_NAME/*"
     ]
    }

    替换以下内容:

    • REGION:AWS 区域,例如 us-east-1
    • ACCOUNT_ID::12 位数字的 AWS 账号 ID
    • DATABASE_NAME:AWS Glue 数据库名称

所需权限

如需获得创建联合数据集所需的权限,请让管理员向您授予 BigQuery Admin (roles/bigquery.admin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色包含创建联合数据集所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

创建联合数据集需要以下权限:

  • bigquery.datasets.create
  • bigquery.connections.use
  • bigquery.connections.delegate

您也可以使用自定义角色或其他预定义角色来获取这些权限。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅 IAM 简介

创建联合数据集

如需创建联合数据集,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中打开 BigQuery 页面。

    转到 BigQuery 页面

  2. 探索器面板中,选择您要在其中创建数据集的项目。

  3. 展开 操作选项,然后点击创建数据集

  4. 创建数据集 页面上,执行以下操作:

    • 对于 Dataset ID,输入唯一的数据集名称。
    • 对于位置类型,为数据集选择一个 AWS 位置,例如 aws-us-east-1。创建数据集后,该位置无法更改。
    • 对于外部数据集,请执行以下操作:

      • 勾选指向外部数据集的链接旁边的复选框。
      • 对于外部数据集类型,选择 AWS Glue
      • 对于外部来源,请输入 aws-glue://,然后输入 AWS Glue 数据库的 Amazon 资源名称 (ARN),例如 aws-glue://arn:aws:glue:us-east-1:123456789:database/test_database
      • 连接 ID 部分,选择您的 AWS 连接。
    • 将其他默认设置保持不变。

  5. 点击创建数据集

SQL

使用 CREATE EXTERNAL SCHEMA 数据定义语言 (DDL) 语句

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

    转到 BigQuery

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

    CREATE EXTERNAL SCHEMA DATASET_NAME
    WITH CONNECTION PROJECT_ID.CONNECTION_LOCATION.CONNECTION_NAME
      OPTIONS (
        external_source = 'AWS_GLUE_SOURCE',
        location = 'LOCATION');

    替换以下内容:

    • DATASET_NAME:BigQuery 中的新数据集的名称。
    • PROJECT_ID:您的项目 ID。
    • CONNECTION_LOCATION:您的 AWS 连接的位置,例如 aws-us-east-1
    • CONNECTION_NAME:您的 AWS 连接的名称。
    • AWS_GLUE_SOURCE:AWS Glue 数据库的 Amazon 资源名称 (ARN),其中包含用于标识来源的前缀,例如 aws-glue://arn:aws:glue:us-east-1:123456789:database/test_database
    • LOCATION:BigQuery 中的新数据集的位置,例如 aws-us-east-1。创建数据集后,您无法更改其位置。

  3. 点击 运行

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

bq

在命令行环境中,使用 bq mk 命令创建数据集:

bq --location=LOCATION mk --dataset \
    --external_source aws-glue://AWS_GLUE_SOURCE \
    --connection_id PROJECT_ID.CONNECTION_LOCATION.CONNECTION_NAME \
    DATASET_NAME

替换以下内容:

  • LOCATION:BigQuery 中的新数据集的位置,例如 aws-us-east-1。创建数据集后,您无法更改其位置。您可以使用 .bigqueryrc 文件设置默认位置值。
  • AWS_GLUE_SOURCE:AWS Glue 数据库的 Amazon 资源名称 (ARN),例如 arn:aws:glue:us-east-1:123456789:database/test_database
  • PROJECT_ID:您的 BigQuery 项目 ID。
  • CONNECTION_LOCATION:您的 AWS 连接的位置,例如 aws-us-east-1
  • CONNECTION_NAME:您的 AWS 连接的名称。
  • DATASET_NAME:BigQuery 中的新数据集的名称。如需在非默认项目中创建数据集,请按照以下格式将项目 ID 添加到数据集名称:PROJECT_ID:DATASET_NAME

Terraform

使用 google_bigquery_dataset 资源

如需向 BigQuery 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为客户端库设置身份验证

以下示例创建了一个 AWS Glue 联合数据集:

resource "google_bigquery_dataset" "dataset" {
  provider                    = google-beta
  dataset_id                  = "example_dataset"
  friendly_name               = "test"
  description                 = "This is a test description."
  location                    = "aws-us-east-1"

external_dataset_reference {
  external_source = "aws-glue://arn:aws:glue:us-east-1:999999999999:database/database"
  connection      = "projects/project/locations/aws-us-east-1/connections/connection"
  }
}

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

API

调用 datasets.insert 方法,并指定 AWS Glue 数据库的数据集资源externalDatasetReference 字段

列出联合数据集中的表

如需列出联合数据集中可用于查询的表,请参阅列出数据集

获取表信息

如需获取联合数据集中的表的相关信息(例如架构详细信息),请参阅获取表信息

控制对表的访问权限

如需管理对联合数据集中的表的访问权限,请参阅使用 IAM 控制对资源的访问权限

联邦数据集中的表也支持行级安全性列级安全性数据遮盖

可能会使安全政策失效的架构操作(例如在 AWS Glue 中删除列)可能会导致作业失败,直到政策更新为止。此外,如果您在 AWS Glue 中删除表并重新创建,您的安全政策将不再应用于重新创建的表。

查询 AWS Glue 数据

查询联合数据集中的表的方法与查询任何其他 BigQuery 数据集中的表相同。

您可以查询以下格式的 AWS Glue 表:

  • CSV(压缩和未压缩均可)
  • JSON(压缩和未压缩均可)
  • Parquet
  • ORC
  • Avro
  • Iceberg

表映射详细信息

您授予访问权限的 AWS Glue 数据库中的每个表都在 BigQuery 数据集中显示为一个等效表。

形式

每个 BigQuery 表的格式由相应的 AWS Glue 表的以下字段决定:

  • InputFormat (Table.StorageDescriptor.InputFormat)
  • OutputFormat (Table.StorageDescriptor.OutputFormat)
  • SerializationLib (Table.StorageDescriptor.SerdeInfo.SerializationLibrary)

唯一的例外是 Iceberg 表,这类表使用 TableType (Table.Parameters["table_type"]) 字段。

例如,具有以下字段的 AWS Glue 表映射到 BigQuery 中的 ORC 表:

  • InputFormat = "org.apache.hadoop.hive.ql.io.orc.OrcInputFormat"
  • OutputFormat = "org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat"
  • SerializationLib = "org.apache.hadoop.hive.ql.io.orc.OrcSerde"

位置

每个 BigQuery 表的位置由以下元素决定:

  • Iceberg 表:AWS Glue 表中的 Table.Parameters["metadata_location"] 字段
  • 非 Iceberg 未分区表:AWS Glue 表中的 Table.StorageDescriptor.Location 字段
  • 非 Iceberg 分区表:AWS Glue GetPartitions API

其他属性

此外,某些 AWS Glue 表属性会自动映射到 BigQuery 中的格式专用选项:

格式 SerializationLib AWS Glue 表值 BigQuery 选项
CSV LazySimpleSerDe Table.StorageDescriptor.SerdeInfo.Parameters["field.delim"] CsvOptions.fieldDelimiter
CSV LazySimpleSerDe Table.StorageDescriptor.Parameters["serialization.encoding"] CsvOptions.encoding
CSV LazySimpleSerDe Table.StorageDescriptor.Parameters["skip.header.line.count"] CsvOptions.skipLeadingRows
CSV OpenCsvSerDe Table.StorageDescriptor.SerdeInfo.Parameters["separatorChar"] CsvOptions.fieldDelimiter
CSV OpenCsvSerDe Table.StorageDescriptor.SerdeInfo.Parameters["quoteChar"] CsvOptions.quote
CSV OpenCsvSerDe Table.StorageDescriptor.Parameters["serialization.encoding"] CsvOptions.encoding
CSV OpenCsvSerDe Table.StorageDescriptor.Parameters["skip.header.line.count"] CsvOptions.skipLeadingRows
JSON Hive JsonSerDe Table.StorageDescriptor.Parameters["serialization.encoding"] JsonOptions.encoding

在联合数据集中创建视图

您无法在联合数据集中创建视图。但是,您可以在标准数据集中创建基于联合数据集中的表的视图。如需了解详情,请参阅创建视图

删除联合数据集

删除联合数据集的方法与删除任何其他 BigQuery 数据集相同。如需了解详情,请参阅删除数据集

价格

如需了解价格,请参阅 BigQuery Omni 价格

限制

  • 所有 BigQuery Omni 限制均适用。
  • 您无法在 AWS Glue 联合数据集中的表中添加、删除或更新数据或元数据。
  • 您无法在 AWS Glue 联合数据集中创建新表、视图或具体化视图。
  • 不支持 INFORMATION_SCHEMA 视图
  • 不支持元数据缓存
  • 与表创建默认设置相关的数据集级设置不会影响联合数据集,因为您无法手动创建表。
  • Avro 表不支持 Apache Hive 数据类型 UNION

后续步骤