本页面介绍如何解决将 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=