Google BigQuery
本文介绍如何在 Azure Databricks 中读取和写入 Google BigQuery 表。
重要
本文所述的配置为试验性配置。 试验性功能按原样提供,Databricks 不会通过客户技术支持为它提供支持。 为了获得完整的查询联合支持,应改为使用 Lakehouse 联合身份验证,这使 Azure Databricks 用户能够利用 Unity Catalog 语法和数据治理工具。
必须使用基于密钥的身份验证连接到 BigQuery。
权限
你的项目必须具有特定的 Google 权限才能使用 BigQuery 进行读取和写入。
注意
本文讨论 BigQuery 具体化视图。 有关详细信息,请参阅 Google 文章具体化视图简介。 若要了解其他 BigQuery 术语和 BigQuery 安全模型,请参阅 Google BigQuery 文档。
使用 BigQuery 读取和写入数据依赖于两个 Google Cloud 项目:
- Project (
project
):Azure Databricks 从中读取或写入 BigQuery 表的 Google Cloud 项目的 ID。 - 父项目 (
parentProject
):父项目的 ID,即要计费的读取和写入的 Google Cloud 项目 ID。 将此设置为与要为其生成密钥的 Google 服务帐户关联的 Google Cloud 项目。
必须在访问 BigQuery 的代码中显式提供 project
和 parentProject
值。 使用类似于下面的代码:
spark.read.format("bigquery") \
.option("table", table) \
.option("project", <project-id>) \
.option("parentProject", <parent-project-id>) \
.load()
Google Cloud 项目所需的权限取决于 project
和 parentProject
是否相同。 以下各节列出了每个方案所需的权限。
project
和 parentProject
匹配时所需的权限
如果 project
和 parentProject
的 ID 相同,请使用下表确定最小权限:
Azure Databricks 任务 | 项目中所需的 Google 权限 |
---|---|
在没有具体化视图的情况下读取 BigQuery 表 | 在 project 项目中:- BigQuery 读取会话用户 - BigQuery 数据查看器(可选择在数据集/表级别授予此权限,而不是项目级别) |
使用具体化视图读取 BigQuery 表 | 在 project 项目中:- BigQuery 作业用户 - BigQuery 读取会话用户 - BigQuery 数据查看器(可选择在数据集/表级别授予此权限,而不是项目级别) 在具体化项目中: - BigQuery 数据编辑器 |
写入 BigQuery 表 | 在 project 项目中:- BigQuery 作业用户 - BigQuery 数据编辑器 |
project
和 parentProject
不同时所需的权限
如果 project
和 parentProject
的 ID 不同,请使用下表确定最小权限:
Azure Databricks 任务 | 所需的 Google 权限 |
---|---|
在没有具体化视图的情况下读取 BigQuery 表 | 在 parentProject 项目中:- BigQuery 读取会话用户 在 project 项目中:- BigQuery 数据查看器(可选择在数据集/表级别授予此权限,而不是项目级别) |
使用具体化视图读取 BigQuery 表 | 在 parentProject 项目中:- BigQuery 读取会话用户 - BigQuery 作业用户 在 project 项目中:- BigQuery 数据查看器(可选择在数据集/表级别授予此权限,而不是项目级别) 在具体化项目中: - BigQuery 数据编辑器 |
写入 BigQuery 表 | 在 parentProject 项目中:- BigQuery 作业用户 在 project 项目中:- BigQuery 数据编辑器 |
步骤 1:设置 Google Cloud
启用 BigQuery 存储 API
BigQuery 存储 API 默认在启用了 BigQuery 的新建 Google Cloud 项目中启用。 但是,如果已有现存项目且未启用 BigQuery 存储 API,请按照本节中的步骤启用它。
可以使用 Google Cloud CLI 或 Google Cloud 控制台启用 BigQuery 存储 API。
使用 Google Cloud CLI 启用 BigQuery 存储 API
gcloud services enable bigquerystorage.googleapis.com
使用 Google Cloud 控制台启用 BigQuery 存储 API
在左侧导航窗格中单击“API 和服务”。
单击“启用 API 和服务”按钮。
在搜索栏中键入
bigquery storage api
并选择第一个结果。确保已启用 BigQuery 存储 API。
为 Azure Databricks 创建 Google 服务帐户
为 Azure Databricks 群集创建服务帐户。 Databricks 建议对此服务帐户授予执行其任务所需的最低权限。 请参阅 BigQuery 角色和权限。
可以使用 Google Cloud CLI 或 Google Cloud 控制台创建服务帐户。
使用 Google Cloud CLI 创建 Google 服务帐户
gcloud iam service-accounts create <service-account-name>
gcloud projects add-iam-policy-binding <project-name> \
--role roles/bigquery.user \
--member="serviceAccount:<service-account-name>@<project-name>.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding <project-name> \
--role roles/bigquery.dataEditor \
--member="serviceAccount:<service-account-name>@<project-name>.iam.gserviceaccount.com"
为服务帐户创建密钥:
gcloud iam service-accounts keys create --iam-account \
"<service-account-name>@<project-name>.iam.gserviceaccount.com" \
<project-name>-xxxxxxxxxxx.json
使用 Google Cloud 控制台创建 Google 服务帐户
创建帐户:
在左侧导航窗格中单击“IAM 和管理员”。
单击“服务帐户”。
单击“+ 创建服务帐户”。
输入服务帐户名称和说明。
单击“创建”。
为服务帐户指定角色。 在“选择角色”下拉列表中,键入
BigQuery
并添加以下角色:单击“继续”。
单击“完成”。
为服务帐户创建密钥:
在服务帐户列表中,单击新创建的帐户。
在“密钥”部分中,选择“添加密钥”>“创建新密钥”。
接受 JSON 密钥类型。
单击“创建”。 JSON 密钥文件将下载到你的计算机。
重要
为服务帐户生成的 JSON 密钥文件是一个私钥,它应只与授权用户共享,因为它控制对 Google Cloud 帐户中数据集和资源的访问。
创建 Google Cloud Storage (GCS) 存储桶用于临时存储
若要将数据写入 BigQuery,数据源需要对 GCS 存储桶的访问权限。
在左侧导航列中,单击“存储”。
单击“创建存储桶”。
配置存储桶详细信息。
单击“创建”。
单击“权限”选项卡和“添加成员”。
对在存储桶上的服务帐户提供以下权限。
单击“保存”。
步骤 2:设置 Azure Databricks
若要配置群集以访问 BigQuery 表,必须提供 JSON 密钥文件作为 Spark 配置。 使用本地工具对 JSON 密钥文件进行 Base64 编码。 出于安全目的,请勿使用可以访问密钥的基于 Web 的工具或远程工具。
在配置群集时:
在“Spark 配置”选项卡中,添加以下 Spark 配置。将 <base64-keys>
替换为 Base64 编码的 JSON 密钥文件的字符串。 将方括号中的其他项(例如 <client-email>
)替换为 JSON 密钥文件中那些字段的值。
credentials <base64-keys>
spark.hadoop.google.cloud.auth.service.account.enable true
spark.hadoop.fs.gs.auth.service.account.email <client-email>
spark.hadoop.fs.gs.project.id <project-id>
spark.hadoop.fs.gs.auth.service.account.private.key <private-key>
spark.hadoop.fs.gs.auth.service.account.private.key.id <private-key-id>
读取和写入到 BigQuery 表
若要读取 BigQuery 表,请指定
df = spark.read.format("bigquery") \
.option("table",<table-name>) \
.option("project", <project-id>) \
.option("parentProject", <parent-project-id>) \
.load()
若要写入到 BigQuery 表,请指定
df.write.format("bigquery") \
.mode("<mode>") \
.option("temporaryGcsBucket", "<bucket-name>") \
.option("table", <table-name>) \
.option("project", <project-id>) \
.option("parentProject", <parent-project-id>) \
.save()
其中,<bucket-name>
是在创建 Google Cloud Storage (GCS) 存储桶用于临时存储中创建的存储桶的名称。 请参阅权限,了解 <project-id>
和 <parent-id>
值的要求。
从 BigQuery 创建外部表
重要
Unity Catalog 不支持此功能。
可以在 Databricks 中声明非托管表,以便直接从 BigQuery 读取数据:
CREATE TABLE chosen_dataset.test_table
USING bigquery
OPTIONS (
parentProject 'gcp-parent-project-id',
project 'gcp-project-id',
temporaryGcsBucket 'some-gcp-bucket',
materializationDataset 'some-bigquery-dataset',
table 'some-bigquery-dataset.table-to-copy'
)
Python 笔记本示例:将 Google BigQuery 表加载到 DataFrame 中
以下 Python 笔记本将 Google BigQuery 表加载到 Azure Databricks DataFrame 中。
Google BigQuery Python 示例笔记本
Scala 笔记本示例:将 Google BigQuery 表加载到 DataFrame 中
以下 Scala 笔记本将 Google BigQuery 表加载到 Azure Databricks DataFrame 中。