1. 概览
BigQuery 是 Google 推出的全托管式低成本分析数据仓库,可支持 PB 级数据规模。BigQuery 无需运维:没有需要管理的基础架构,也无需指派数据库管理员,因此您可以专注于分析数据,使用熟悉的 SQL 发掘有意义的数据洞见,并利用我们的随用随付模式。
在此 Codelab 中,您将使用 Python 版 Google Cloud 客户端库通过 Python 查询 BigQuery 公共数据集。
学习内容
- 如何使用 Cloud Shell
- 如何启用 BigQuery API
- 如何对 API 请求进行身份验证
- 如何安装 Python 客户端库
- 如何查询莎士比亚的作品
- 如何查询 GitHub 数据集
- 如何调整缓存和显示统计信息
所需条件
调查问卷
您将如何使用本教程?
您如何评价使用 Python 的体验?
您如何评价自己在使用 Google Cloud 服务方面的经验水平?
<ph type="x-smartling-placeholder">2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
激活 Cloud Shell
- 在 Cloud Console 中,点击激活 Cloud Shell。
如果您以前从未启动过 Cloud Shell,系统会显示一个中间屏幕(非首屏)来介绍 Cloud Shell。如果是这种情况,请点击继续(此后您将不会再看到此通知)。一次性屏幕如下所示:
预配和连接到 Cloud Shell 只需花几分钟时间。
这个虚拟机装有您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器或 Google Chromebook 即可完成本 Codelab 中的大部分(甚至全部)工作。
在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:
- 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list
命令输出
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目:
gcloud config list project
命令输出
[core] project = <PROJECT_ID>
如果不是上述结果,您可以使用以下命令进行设置:
gcloud config set project <PROJECT_ID>
命令输出
Updated property [core/project].
3. 启用 API
默认情况下,BigQuery API 应在所有 Google Cloud 项目中启用。您可以在 Cloud Shell 中使用以下命令检查是否属实:BigQuery 应该会列出:
gcloud services list
您应该会看到 BigQuery 列出:
NAME TITLE bigquery.googleapis.com BigQuery API ...
如果 BigQuery API 未启用,您可以在 Cloud Shell 中使用以下命令启用它:
gcloud services enable bigquery.googleapis.com
4. 对 API 请求进行身份验证
要向 BigQuery API 发出请求,您需要使用服务账号。服务账号属于您的项目,供 Google Cloud Python 客户端库用于发出 BigQuery API 请求。与任何其他用户账号一样,服务账号由电子邮件地址表示。在本部分中,您将使用 Cloud SDK 创建服务账号,然后创建以该服务账号的身份进行身份验证所需的凭据。
首先,设置一个 PROJECT_ID
环境变量:
export PROJECT_ID=$(gcloud config get-value core/project)
接下来,使用以下命令创建一个新的服务账号来访问 BigQuery API:
gcloud iam service-accounts create my-bigquery-sa \ --display-name "my bigquery service account"
接下来,创建 Python 代码将用于以新服务账号身份登录的凭据。使用以下命令创建这些凭据并将其保存为 JSON 文件 ~/key.json
:
gcloud iam service-accounts keys create ~/key.json \ --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com
最后,设置 BigQuery Python 客户端库使用的 GOOGLE_APPLICATION_CREDENTIALS
环境变量来查找凭据,该变量将在下一步中介绍。应使用以下命令将环境变量设置为您创建的凭据 JSON 文件的完整路径:
export GOOGLE_APPLICATION_CREDENTIALS=~/key.json
您可以详细了解如何对 BigQuery API 进行身份验证。
5. 设置访问权限控制
BigQuery 使用 Identity and Access Management (IAM) 来管理对资源的访问权限。BigQuery 具有许多预定义角色(user、dataOwner、dataViewer 等),您可以将这些角色分配给您在上一步中创建的服务账号。如需详细了解访问权限控制,请参阅 BigQuery 文档。
在查询公共数据集之前,您需要确保服务账号至少具有 roles/bigquery.user
角色。在 Cloud Shell 中运行以下命令,将用户角色分配给服务账号:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \ --role "roles/bigquery.user"
您可以运行以下命令来验证服务账号是否具有用户角色:
gcloud projects get-iam-policy $PROJECT_ID
您应该会看到以下内容:
bindings: - members: - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com role: roles/bigquery.user ...
6. 安装客户端库
安装 BigQuery Python 客户端库:
pip3 install --user --upgrade google-cloud-bigquery
现在,您就可以使用 BigQuery API 编写代码了!
7. 查询莎士比亚的作品
公共数据集是存储在 BigQuery 中且可供公众使用的任何数据集。还有许多其他公共数据集可供您查询。虽然有些数据集是由 Google 托管,但大多数数据集是由第三方托管。如需了解详情,请参阅公共数据集页面。
除公共数据集外,BigQuery 还提供了有限数量的示例表供您查询。这些表包含在 bigquery-public-data:samples
数据集中。samples
数据集中的 shakespeare
表包含莎士比亚作品的字词索引。它给出了每个字词在每个语料库中出现的次数。
在此步骤中,您将查询 shakespeare
表。
首先,在 Cloud Shell 中创建一个简单的 Python 应用,您将用来运行 Translation API 示例。
mkdir bigquery-demo cd bigquery-demo touch app.py
从 Cloud Shell 的右上角打开代码编辑器:
找到 bigquery-demo
文件夹内的 app.py
文件,并将代码替换为以下代码。
from google.cloud import bigquery
client = bigquery.Client()
query = """
SELECT corpus AS title, COUNT(word) AS unique_words
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY title
ORDER BY unique_words
DESC LIMIT 10
"""
results = client.query(query)
for row in results:
title = row['title']
unique_words = row['unique_words']
print(f'{title:<20} | {unique_words}')
花一两分钟时间研究一下代码,看看如何查询该表。
返回 Cloud Shell,运行应用:
python3 app.py
您应该会看到一个字词列表及其出现次数:
hamlet | 5318 kinghenryv | 5104 cymbeline | 4875 troilusandcressida | 4795 kinglear | 4784 kingrichardiii | 4713 2kinghenryvi | 4683 coriolanus | 4653 2kinghenryiv | 4605 antonyandcleopatra | 4582
8. 查询 GitHub 数据集
为了更加熟悉 BigQuery,您现在需要针对 GitHub 公开数据集发出查询。您可以在 GitHub 上找到最常见的提交消息。您还将使用 BigQuery 的 Web 控制台来预览和运行临时查询。
如需查看数据,请在 BigQuery 网页界面中打开 GitHub 数据集:
点击“预览”按钮查看数据:
找到 bigquery_demo
文件夹内的 app.py
文件,并将代码替换为以下代码。
from google.cloud import bigquery
client = bigquery.Client()
query = """
SELECT subject AS subject, COUNT(*) AS num_duplicates
FROM bigquery-public-data.github_repos.commits
GROUP BY subject
ORDER BY num_duplicates
DESC LIMIT 10
"""
results = client.query(query)
for row in results:
subject = row['subject']
num_duplicates = row['num_duplicates']
print(f'{subject:<20} | {num_duplicates:>9,}')
花一两分钟时间研究一下代码,看看如何查询表中最常见的提交消息。
返回 Cloud Shell,运行应用:
python3 app.py
您应该会看到提交消息及其发生实例的列表:
Update README.md | 1,685,515 Initial commit | 1,577,543 update | 211,017 | 155,280 Create README.md | 153,711 Add files via upload | 152,354 initial commit | 145,224 first commit | 110,314 Update index.html | 91,893 Update README | 88,862
9. 缓存和统计信息
BigQuery 会缓存查询结果。因此,后续查询所需的时间会更短。您可以使用查询选项停用缓存。BigQuery 还会跟踪有关查询的统计信息,例如创建时间、结束时间、处理的总字节数。
在此步骤中,您将停用缓存,并显示有关查询的统计信息。
找到 bigquery_demo
文件夹内的 app.py
文件,并将代码替换为以下代码。
from google.cloud import bigquery
client = bigquery.Client()
query = """
SELECT subject AS subject, COUNT(*) AS num_duplicates
FROM bigquery-public-data.github_repos.commits
GROUP BY subject
ORDER BY num_duplicates
DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)
for row in results:
subject = row['subject']
num_duplicates = row['num_duplicates']
print(f'{subject:<20} | {num_duplicates:>9,}')
print('-'*60)
print(f'Created: {results.created}')
print(f'Ended: {results.ended}')
print(f'Bytes: {results.total_bytes_processed:,}')
关于代码的几点注意事项。首先,通过引入 QueryJobConfig
并将 use_query_cache
设置为 false 来停用缓存。其次,您从作业对象访问了有关查询的统计信息。
返回 Cloud Shell,运行应用:
python3 app.py
与之前一样,您应该会看到提交消息及其发生实例的列表。此外,您还应该在最后看到有关该查询的一些统计信息:
Update README.md | 1,685,515 Initial commit | 1,577,543 update | 211,017 | 155,280 Create README.md | 153,711 Add files via upload | 152,354 initial commit | 145,224 first commit | 110,314 Update index.html | 91,893 Update README | 88,862 ------------------------------------------------------------ Created: 2020-04-03 13:30:08.801000+00:00 Ended: 2020-04-03 13:30:15.334000+00:00 Bytes: 2,868,251,894
10. 将数据加载到 BigQuery 中
如果您想查询自己的数据,则需要将数据加载到 BigQuery 中。BigQuery 支持从多种来源加载数据,包括 Cloud Storage、其他 Google 服务和其他可读来源。您甚至可以使用流式插入来流式传输数据。如需了解详情,请参阅将数据加载到 BigQuery 中页面。
在此步骤中,您需要将存储在 Cloud Storage 中的 JSON 文件加载到 BigQuery 表中。JSON 文件位于 gs://cloud-samples-data/bigquery/us-states/us-states.json
如果您想了解 JSON 文件的内容,可以使用 gsutil
命令行工具在 Cloud Shell 中下载该文件:
gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .
您可以看到,该文件包含美国各州的列表,每个州都是一个 JSON 文档,并单独占一行:
head us-states.json
{"name": "Alabama", "post_abbr": "AL"} {"name": "Alaska", "post_abbr": "AK"} ...
如需将此 JSON 文件加载到 BigQuery 中,请找到 bigquery_demo
文件夹内的 app.py
文件,并将代码替换为以下代码。
from google.cloud import bigquery
client = bigquery.Client()
gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'
dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')
job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
bigquery.SchemaField('name', 'STRING'),
bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)
print('JSON file loaded to BigQuery')
花两分钟时间研究一下代码如何加载 JSON 文件以及如何在数据集下创建具有架构的表。
返回 Cloud Shell,运行应用:
python3 app.py
在 BigQuery 中创建一个数据集和一个表。
如需验证数据集是否已创建,请转到 BigQuery 控制台。您应该会看到一个新的数据集和表。切换到表格的“预览”标签页查看您的数据:
11. 恭喜!
您已了解如何在 Python 中使用 BigQuery!
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请执行以下操作:
- 在 Cloud Console 中,转到管理资源页面。
- 在项目列表中,选择您的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关停以删除项目。
了解详情
- Google BigQuery:https://cloud.google.com/bigquery/docs/
- Google Cloud 上的 Python:https://cloud.google.com/python/
- Python 版 Cloud 客户端库:https://googleapis.github.io/google-cloud-python/
许可
此作品已获得 Creative Commons Attribution 2.0 通用许可授权。