BigLake metastore 是一种单一的共享 metastore,可实现数据处理引擎之间的数据共享,从而无需为开源工作负载维护单独的 metastore。
本文档介绍了如何在 BigLake Metastore 中创建、查看、修改和删除资源。
准备工作
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Storage, and Dataproc APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
所需的角色
如需获得在 BigLake metastore 中管理 Iceberg 资源所需的权限,请让管理员为您授予项目的以下 IAM 角色:
-
BigQuery Data Editor (
roles/bigquery.dataEditor) -
Storage Object User (
roles/storage.objectUser)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
创建 metastore 资源
以下部分介绍如何在 BigLake metastore 中创建资源。
创建命名空间
从下列选项中选择一项:
API
使用 datasets.insert 方法,并在传入的 数据集资源中指定 ExternalCatalogDatasetOptions 字段。
{
"datasetReference": {
"projectId": "PROJECT_ID",
"datasetId": "DATASET_ID"
},
"externalCatalogDatasetOptions": {
"defaultStorageLocationUri": "URI",
"parameters": {
...
}
},
"location": "LOCATION"
}替换以下内容:
PROJECT_ID:包含目标数据集的项目的 IDDATASET_ID:目标数据集的 IDURI:数据集中所有表的 Cloud Storage URILOCATION:要在其中创建数据集的 BigQuery 位置
Spark SQL
CREATE NAMESPACE SPARK_CATALOG.NAMESPACE;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:新命名空间的名称
Terraform
provider "google" { project = "PROJECT_ID" } resource "google_bigquery_dataset" "default" { dataset_id = "DATASET_ID" location = "LOCATION" external_catalog_dataset_options { default_storage_location_uri = "URI" parameters = { ... } } }
替换以下内容:
PROJECT_ID:包含目标数据集的项目的 IDDATASET_ID:目标数据集的 IDLOCATION:要在其中创建数据集的 BigQuery 位置URI:数据集中所有表的 Cloud Storage URI
创建 Iceberg 表
从下列选项中选择一项:
API
使用 tables.insert 方法,并在传入的表资源中指定 ExternalCatalogTableOptions 字段。
{ "tableReference": { "projectId": "PROJECT_ID", "datasetId": "DATASET_ID", "tableId": "TABLE_ID" }, "externalCatalogTableOptions": { "parameters": { "table_type": "iceberg", "metadata_location": "METADATA_URI" }, "connection_id": "CONNECTION_ID" } }
替换以下内容:
PROJECT_ID:包含目标表的项目的 ID。DATASET_ID:包含目标表的数据集的 ID。TABLE_ID:目标表的 ID。METADATA_URI:最新 Iceberg 元数据文件的 Cloud Storage URI。例如gs://mybucket/mytable/metadata/1234.metadata.json。CONNECTION_ID:与 Cloud Storage 的连接的 ID。
Spark SQL
CREATE TABLE SPARK_CATALOG.NAMESPACE.TABLE (id bigint, data string) USING iceberg;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:您的命名空间名称TABLE:新表的名称
Terraform
resource "google_bigquery_table" "default" { deletion_protection = false dataset_id = google_bigquery_dataset.default.dataset_id table_id = "TABLE" external_catalog_table_options { storage_descriptor { location_uri = "STORAGE_URI" input_format = "org.apache.hadoop.mapred.FileInputFormat" output_format = "org.apache.hadoop.mapred.FileOutputFormat" } parameters = { "table_type" = "iceberg" "metadata_location" = "METADATA_URI" "write.parquet.compression-codec" : "zstd" "EXTERNAL" : "TRUE" } } }
替换以下内容:
TABLE:目标表的名称。STORAGE_URI:用于存储表数据的 Cloud Storage URI,以gs://开头。METADATA_URI:最新 Iceberg 元数据文件的 Cloud Storage URI。例如gs://mybucket/mytable/metadata/1234.metadata.json。
查看 metastore 资源
以下部分介绍如何在 BigLake metastore 中查看资源。
查看命名空间
从下列选项中选择一项:
API
使用 datasets.list 方法可查看所有命名空间,使用 datasets.get 方法可查看有关已定义命名空间的信息。
Spark SQL
如需查看目录中的所有命名空间,请使用以下语句:
SHOW { DATABASES | NAMESPACES } IN SPARK_CATALOG;
将 SPARK_CATALOG 替换为 Spark 目录的名称。
如需查看有关已定义命名空间的信息,请使用以下语句:
DESCRIBE { DATABASE | NAMESPACE } [EXTENDED] SPARK_CATALOG.NAMESPACE;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:您的命名空间名称
查看表
从下列选项中选择一项:
API
使用 tables.list 方法可查看命名空间中的所有表,使用 tables.get 方法可查看有关已定义表的信息。
Spark SQL
如需查看命名空间中的所有表,请使用以下语句:
SHOW TABLES IN SPARK_CATALOG.NAMESPACE;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:您的命名空间名称
如需查看有关已定义表的信息,请使用以下语句:
DESCRIBE TABLE [EXTENDED] SPARK_CATALOG.NAMESPACE.TABLE;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:您的命名空间名称TABLE:您的表的名称。
修改 metastore 资源
以下部分介绍如何在 BigLake metastore 中修改资源。
更新命名空间
从下列选项中选择一项:
API
使用 datasets.patch 方法,并更新数据集资源中的 ExternalCatalogDatasetOptions 字段。不建议使用 datasets.update 方法,因为它会替换整个数据集资源。
Spark SQL
更新 Iceberg 表
从下列选项中选择一项:
API
使用 tables.patch 方法,并更新表资源中的 ExternalCatalogTableOptions 字段。不建议使用 tables.update 方法,因为它会替换整个表资源。
如需更新架构或元数据文件,请使用 tables.patch 方法并将 autodetect_schema 属性设置为 true:
PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID?autodetect_schema=true
替换以下内容:
PROJECT_ID:包含要更新的表的项目的 IDDATASET_ID:包含要更新的表的数据集的 IDTABLE_ID:要更新的表的 ID
在请求正文中,为每个字段指定更新后的值。例如,如需更新 Iceberg 表的元数据位置,请为 metadata_location 字段指定更新后的值:
{
"externalCatalogTableOptions": {
"parameters": {"metadata_location": "METADATA_URI"}
},
"schema": null
}'将 METADATA_URI 替换为最新 Iceberg 元数据文件的 Cloud Storage URI。例如 gs://mybucket/mytable/metadata/1234.metadata.json。
Spark SQL
使用 ALTER TABLE 语句。
删除 metastore 资源
以下部分介绍如何在 BigLake metastore 中删除资源。
删除命名空间
从下列选项中选择一项:
API
使用 datasets.delete 方法。
将 deleteContents 参数设置为 true 可删除命名空间中的表。
Spark SQL
DROP NAMESPACE SPARK_CATALOG.NAMESPACE;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:您的命名空间名称
删除表
从下列选项中选择一项:
API
使用 tables.delete 方法并指定表的名称。此方法不会删除 Cloud Storage 中的关联文件。
Spark SQL
如需仅删除表,请使用以下语句:
DROP TABLE SPARK_CATALOG.NAMESPACE.TABLE;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:您的命名空间名称TABLE:要删除的表的名称
如需删除表并删除 Cloud Storage 中的关联文件,请使用以下语句:
DROP TABLE SPARK_CATALOG.NAMESPACE.TABLE PURGE;
替换以下内容:
SPARK_CATALOG:Spark 目录的名称NAMESPACE:您的命名空间名称TABLE:要删除的表的名称