在 Google BigQuery 上运行联合查询

本页介绍如何设置 Lakehouse 联合查询,以在 Azure Databricks 未管理的 BigQuery 数据上运行联合查询。 若要了解有关 Lakehouse 联合的详细信息,请参阅 什么是 Lakehouse 联合?

若要使用 Lakehouse Federation 连接到 BigQuery 数据库,必须在 Azure Databricks Unity Catalog 元存储中创建以下内容:

  • 与 BigQuery 数据库的连接
  • 一个外部目录,它镜像 Unity Catalog 中的 BigQuery 数据库,以便你可使用 Unity Catalog 查询语法和数据治理工具来管理 Azure Databricks 用户对数据库的访问。

开始之前

工作区要求:

  • 已为 Unity Catalog 启用工作区。

计算要求:

  • 从 Databricks Runtime 群集或 SQL 仓库到目标数据库系统的网络连接。 请参阅 Lakehouse Federation 的网络建议
  • Azure Databricks 群集必须使用 Databricks Runtime 16.1 或更高版本以及标准或专用访问模式(以前共享和单个用户)。
  • SQL 仓库必须是 Pro 或无服务器仓库。

所需的权限:

  • 若要创建连接,必须是元存储管理员或对附加到工作区的 Unity Catalog 元存储具有 CREATE CONNECTION 特权的用户。
  • 若要创建外部目录,必须对元存储具有 CREATE CATALOG 权限,并且是连接的所有者或对连接具有 CREATE FOREIGN CATALOG 特权。

后面每个基于任务的部分都指定了其他权限要求。

创建连接

连接指定用于访问外部数据库系统的路径和凭据。 若要创建连接,可以使用目录资源管理器,或者使用 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 CREATE CONNECTION SQL 命令。

注意

你还可以使用 Databricks REST API 或 Databricks CLI 来创建连接。 请参阅 POST /api/2.1/unity-catalog/connectionsUnity Catalog 命令

所需的权限:具有 CREATE CONNECTION 特权的元存储管理员或用户。

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击 “数据”图标。目录

  2. 在“目录”窗格顶部,单击 添加或加号图标“添加”图标,然后从菜单中选择“添加连接”

    也可在快速访问页中单击外部数据 > 按钮,转到连接选项卡,然后单击创建连接

  3. 在“设置连接”向导的“连接基本信息”页上,输入一个用户友好的“连接名称”

  4. 选择 Google BigQuery连接类型,然后单击下一步

  5. 身份验证 页上,输入 BigQuery 实例的 Google 服务帐户密钥 json

    这是一个原始 JSON 对象,用于指定 BigQuery 项目并提供身份验证。 可以在 Google Cloud 中的“KEYS”下生成此 JSON 对象,并从服务帐户详细信息页下载该对象。 该服务帐户必须具有 BigQuery 中授予的适当权限,包括 BigQuery 用户BigQuery 数据查看者。 下面是一个示例。

    {
      "type": "service_account",
      "project_id": "PROJECT_ID",
      "private_key_id": "KEY_ID",
      "private_key": "PRIVATE_KEY",
      "client_email": "SERVICE_ACCOUNT_EMAIL",
      "client_id": "CLIENT_ID",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://accounts.google.com/o/oauth2/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL",
      "universe_domain": "googleapis.com"
    }
    
  6. (可选)输入 BigQuery 实例的 项目 ID

    此为 BigQuery 项目的名称,专用于为在该连接下运行的所有查询进行计费。 默认为服务帐户的项目 ID。 服务帐户必须在 BigQuery 中为此项目授予适当的权限,包括 BigQuery 用户。 此项目中可能会创建用于存储 BigQuery 临时表的其他数据集。

  7. (可选)添加注释。

  8. 单击“创建连接”。

  9. 目录基础 页上,输入外国目录的名称。 外部目录镜像外部数据系统中的数据库,以便可以使用 Azure Databricks 和 Unity Catalog 查询和管理对该数据库中数据的访问。

  10. (可选)单击“测试连接”以确认其正常工作。

  11. 单击“创建目录”。

  12. 在“Access”页上,选择工作区,使用户可以在其中访问您所创建的目录。 可以选择 让所有工作区都有访问权限,或单击 分配给工作区,选择工作区,然后单击 分配

  13. 更改 所有者,使其能够管理对目录中所有对象的访问。 开始在文本框中键入主体,然后在返回的结果中单击该主体。

  14. 授予对目录的“特权”。 单击“授予”:

    1. 指定有权访问目录中对象的主体。 开始在文本框中键入主体,然后在返回的结果中单击该主体。
    2. 选择要授予每个主体的“特权预设”。 默认情况下,向所有帐户用户授予 BROWSE
      • 在下拉菜单中选择“数据读取者”,以授予对目录中对象的 read 权限。
      • 在下拉菜单中选择“数据编辑者”,以授予对目录中对象的 readmodify 权限。
      • 手动选择要授予的权限。
    3. 单击“授予”。
  15. 单击“下一步”。

  16. 在“元数据”页上,指定标记键值对。 有关详细信息,请参阅将标记应用于 Unity Catalog 安全对象

  17. (可选)添加注释。

  18. 单击“保存”

SQL

在笔记本或 Databricks SQL 查询编辑器中运行以下命令。 将 <GoogleServiceAccountKeyJson> 替换为指定 BigQuery 项目并提供身份验证的原始 JSON 对象。 可以在 Google Cloud 中的“KEYS”下生成此 JSON 对象,并从服务帐户详细信息页下载该对象。 该服务帐户需要具有 BigQuery 中授予的适当权限,包括 BigQuery 用户和 BigQuery 数据查看者。 有关示例 JSON 对象,请查看此页面上的 Catalog Explorer 选项卡。

CREATE CONNECTION <connection-name> TYPE bigquery
OPTIONS (
  GoogleServiceAccountKeyJson '<GoogleServiceAccountKeyJson>'
);

建议对凭据等敏感值使用 Azure Databricks 机密而不是纯文本字符串。 例如:

CREATE CONNECTION <connection-name> TYPE bigquery
OPTIONS (
  GoogleServiceAccountKeyJson secret ('<secret-scope>','<secret-key-user>')
)

有关设置机密的详细信息,请参阅机密管理

创建外部目录

注意

如果使用 UI 创建与数据源的连接,则会包含外部目录创建,可以跳过此步骤。

外部目录镜像外部数据系统中的数据库,以便可以使用 Azure Databricks 和 Unity Catalog 查询和管理对该数据库中数据的访问。 若要创建外部目录,请使用与已定义的数据源的连接。

若要创建外部目录,可以使用 Catalog Explorer,或者使用 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 CREATE FOREIGN CATALOG。 你还可以使用 Databricks REST API 或 Databricks CLI 来创建目录。 请参阅 POST /api/2.1/unity-catalog/catalogsUnity Catalog 命令

所需的权限:对元存储的 CREATE CATALOG 权限以及连接的所有权或对连接的 CREATE FOREIGN CATALOG 特权。

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击 “数据”图标以打开目录资源管理器

  2. 在“目录”窗格顶部,单击 “添加”图标,然后从菜单中选择“添加目录”。Add or plus icon

    也可在“快速访问”页中单击“目录”按钮,然后单击“创建目录”按钮。

  3. (可选)输入以下目录属性:

    数据项目 ID:包含将映射到此目录的数据的 BigQuery 项目的名称。 默认为在连接级别设置的计费项目 ID。

  4. 按照创建目录中的说明创建外部目录。

SQL

在笔记本或 Databricks SQL 编辑器中运行以下 SQL 命令。 括号中的项是可选的。 替换占位符值。

  • <catalog-name>:Azure Databricks 中目录的名称。
  • <connection-name>:指定数据源、路径和访问凭据的连接对象
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>;

支持的下推

支持以下下推:

  • 筛选器
  • 投影数
  • 限制
  • 函数:部分,仅适用于筛选器表达式。 (字符串函数、数学函数、数据、时间和时间戳函数以及其他杂项函数,例如 Alias、Cast、SortOrder)
  • 聚合
  • 排序(与限制一起使用时)
  • 联接(Databricks Runtime 16.1 或更高版本)

不支持以下下推:

  • Windows 函数

数据类型映射

下表显示了 BigQuery 到 Spark 数据类型的映射。

BigQuery 类型 Spark 类型
大数字, 数字 DecimalType
int64 LongType
float64 DoubleType
array,地理,时间间隔,json,字符串,结构体 VarcharType
bytes BinaryType
布尔 BooleanType
日期 日期类型
日期时间、时间、时间戳 TimestampType/TimestampNTZType

从 BigQuery 读取时,如果 Timestamp,则 BigQuery TimestampType 将映射到 Spark preferTimestampNTZ = false(默认)。 如果 Timestamp,则 BigQuery TimestampNTZType 将映射到 preferTimestampNTZ = true

Troubleshooting

Error creating destination table using the following query [<query>]

常见原因:连接使用的服务帐户没有 BigQuery 用户 角色。

解决方法:

  1. 向连接使用的服务帐户授予 BigQuery 用户 角色。 此角色需要用于创建临时存储查询结果的具体化数据集。
  2. 重新运行查询。