本页面介绍如何解决将 SAP Business Data Cloud (BDC) 与 BigQuery 集成时出现的常见问题。如需了解 SAP 到 Google Cloud (联合)工作流,请参阅 Lakehouse 问题排查页面。
查询表时出现 NOT_FOUND 或 PERMISSION_DENIED 错误
当 SAP BDC 端撤消访问权限时,会出现此问题。对受影响表的查询失败,并返回源自 Delta Sharing 端点的“找不到”或“权限被拒”错误。
如需解决此问题,请与 SAP 管理员协作以恢复对表的访问权限。如需详细了解 SAP 中的访问权限管理,请参阅 SAP 文档中的在 SAP Business Data Cloud Connect 中使用数据产品。
无法将数据写入 SAP BDC 表
当您尝试从 BigQuery 写入或修改 SAP BDC 表中的数据时,会出现此问题。此集成提供对 SAP BDC 数据的只读访问权限。
如需解决此问题,请直接在 SAP BDC 中修改数据。
Delta Sharing API 调用的价格费用超出预期
如果您的 Lakehouse 目录与 SAP BDC 同步过于频繁,则可能会出现此问题,这会调用 Delta Sharing API 来列出表并获取表元数据。这些 API 调用按 Lakehouse A 类操作收费。
如需解决此问题,请增加目录的刷新间隔,以降低 API 调用的频率。如需详细了解价格,请参阅 Lakehouse 价格。
SAP 无法找到或查询已发布的表
如果您的 Cloud Storage 存储桶中未正确生成 SAP BDC 所需的 Apache Iceberg 元数据,则可能会出现此问题。
如需解决此问题,请验证存储路径(支持您的表)中是否存在预期的元数据文件:
列出表的
metadata文件夹的内容:gcloud storage ls "gs://BUCKET_NAME/NAMESPACE_NAME/TABLE_NAME/metadata/"
验证输出是否包含标准 Apache Iceberg 元数据文件,包括:
version-hint.txtv*.metadata.json- 清单文件 (
.avro)。如果缺少这些文件,请检查 Iceberg REST 目录配置或 BigQuery 中的写入操作,以确保数据和元数据已成功具体化到存储桶中。
表发布失败,并显示缺少主键或可为 null 的字段错误
当您将 Apache Iceberg 目录或数据产品发布到 SAP BDC 时,如果目录或数据产品中的表未在其 Iceberg 元数据中定义主键,或者其中一个主键列被定义为可为 null (required: false),则会出现此问题。
发生这种情况时,发布会失败,并显示以下错误之一:
INVALID_ARGUMENT: Failed to generate Core Schema Notation (CSN) payload: Table 'TABLE_NAME' must have a primary key constraint to be published to SAP.INVALID_ARGUMENT: Field COLUMN_NAME is not required, but is referenced in the identifier-field-ids property.
SAP BDC 要求所有已发布的表都使用 Iceberg 元数据中的 identifier-field-ids 定义主键约束。根据 Apache Iceberg 规范,identifier-field-ids 中指定的所有列也必须配置为不可为 null (required: true)。
如需解决此问题,请使用 BigLake Iceberg REST API 执行原子架构更新,将主键列标记为 required: true,并在 identifier-field-ids 中指定其字段 ID:
获取访问令牌以进行授权:
TOKEN=$(gcloud auth application-default print-access-token)
使用 Python 发送 Iceberg REST 架构更新提交:
import requests headers = { "Authorization": f"Bearer {TOKEN}", "x-goog-user-project": "PROJECT_ID", "X-Iceberg-Access-Delegation": "vended-credentials", "Content-Type": "application/json", } url = "https://biglake.googleapis.com/iceberg/v1/restcatalog/v1/projects/PROJECT_ID/catalogs/ICEBERG_CATALOG_ID/namespaces/NAMESPACE_NAME/tables/TABLE_NAME" # 1. Fetch current metadata meta = requests.get(url, headers=headers).json()["metadata"] schema = meta["schemas"][0].copy() schema["fields"] = [f.copy() for f in schema["fields"]] # 2. Mark primary key column as required (non-nullable) and set identifier-field-ids for f in schema["fields"]: if f["name"] == "PRIMARY_KEY_COLUMN_NAME": f["required"] = True schema["identifier-field-ids"] = [PRIMARY_KEY_FIELD_ID] schema["schema-id"] = meta.get("last-schema-id", 0) + 1 # 3. Commit the updated schema update_payload = { "requirements": [{"type": "assert-table-uuid", "uuid": meta["table-uuid"]}], "updates": [ { "action": "add-schema", "schema": schema, "last-column-id": meta.get("last-column-id", 0), }, {"action": "set-current-schema", "schema-id": -1}, ], } response = requests.post(url, headers=headers, json=update_payload) response.raise_for_status()
替换以下内容:
PROJECT_ID:您的 Google Cloud 项目 ID。ICEBERG_CATALOG_ID:您的 Iceberg REST 目录 ID。NAMESPACE_NAME:您的 Iceberg 命名空间名称。TABLE_NAME:您的 Iceberg 表名称。PRIMARY_KEY_COLUMN_NAME:要设置为主键的列的名称。PRIMARY_KEY_FIELD_ID:主键列的整数字段 ID(例如1)。
对 SAP 的查询失败,并显示权限错误或找不到错误
如果在将目录或数据产品发布到 SAP BDC 后,BigQuery 中撤消了访问权限或修改了权限,则可能会出现此问题。对受影响表的查询将在 SAP 端失败,通常会显示源自 BigQuery 的“找不到”或“权限被拒”错误。
如需解决此问题,请验证工作负载身份联合正文是否保留了所需的角色(例如 BigLake Viewer),并且是否授予了标准 BigQuery 数据集或表访问权限。如需详细了解如何在 SAP 中安装和使用数据产品,请参阅 SAP 文档中的安装 数据 产品。
SAP BDC 中未显示新表或元数据更改
当您在 Apache Iceberg REST 目录或 Knowledge Catalog 数据产品中添加新表或更新现有表元数据时,如果 SAP 使用者看不到这些更改,则可能会出现此问题。虽然底层数据保持最新,但元数据更新可能需要显式操作。
如需解决此问题,请为目录或数据产品执行新的发布操作 (gcloud biglake
data-product-sharing publish),以便在 SAP BDC 中发现新
元数据。
无法将数据从 SAP 写回 BigQuery
当您尝试使用已发布的 SAP 集成从 SAP BDC 写入或修改 BigQuery 中的数据时,会出现此问题。此集成提供从 SAP BDC 对 BigQuery 数据的只读访问权限,以防止意外覆盖数据或违反安全规定。
如需解决此问题,请使用 BigQuery 或标准 Google Cloud 流水线直接处理和写入源数据。
查询表时出现 RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER 错误
如果您的环境强制执行了 VPC Service Controls,并且对项目应用的边界限制了 storage.googleapis.com 服务,则可能会出现此问题。
由于 Dremel 在查询表时需要读取 SAP 项目中的传入 Cloud Storage 存储分区,因此系统会禁止该请求,因为 SAP 项目位于您的边界之外。
如需解决此问题,请配置 VPC Service Controls 出站规则。如需详细了解配置,请参阅 SAP BDC 的 VPC Service Controls 配置。