运行查询
本文档介绍如何在 BigQuery 中运行查询,并通过执行试运行来了解查询在执行之前将处理多少数据。
交互式查询与批量查询
在 BigQuery 中,您可以运行两种类型的查询:
- 交互式查询作业,即 BigQuery 按需运行的作业。
- 批量查询作业,即 BigQuery 等待空闲计算资源可用之前运行的作业。
默认情况下,BigQuery 将您的查询作为交互式查询作业运行,会尽快运行。 BigQuery 会根据资源可用性动态计算并发查询限制,并且比批量查询运行更多的并发交互式查询。达到并发查询限制后,其他查询将在队列中等待。如需了解详情,请参阅查询队列。
BigQuery 会将查询结果保存到临时表(默认)或永久表中。指定永久表作为结果的目标表时,您可以选择是附加还是覆盖现有表,或者创建具有唯一名称的新表。
所需的角色
如需获得运行查询作业所需的权限,请让您的管理员授予您以下 IAM 角色:
-
针对项目的 BigQuery Job User (
roles/bigquery.jobUser
)。 -
针对查询引用的所有表和视图的 BigQuery Data Viewer (
roles/bigquery.dataViewer
)。如需查询视图,您还需要在所有底层表和视图上使用此角色。如果您使用的是已获授权的视图或已获授权的数据集,则无需访问底层源数据。
如需详细了解如何授予角色,请参阅管理访问权限。
这些预定义角色包含运行查询作业所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需运行查询作业,您需要拥有以下权限:
如需详细了解 BigQuery 权限,请参阅使用 IAM 进行访问权限控制。
运行交互式查询
如需运行交互式查询,请选择以下任一选项:
控制台
转到 BigQuery 页面。
点击
编写新查询。在查询编辑器中,输入有效的 GoogleSQL 查询。
例如,查询 BigQuery 公开数据集
usa_names
,以确定 1910 年至 2013 年间美国人最常用的名字:SELECT name, gender, SUM(number) AS total FROM `bigquery-public-data.usa_names.usa_1910_2013` GROUP BY name, gender ORDER BY total DESC LIMIT 10;
可选:指定查询结果的目标表和位置:
- 在查询编辑器中,点击 更多,然后点击查询设置。
- 在目标位置部分,选择为查询结果设置目标表。
- 在数据集部分,输入目标表的现有数据集的名称,例如
myProject.myDataset
。 - 在表 ID 部分,输入目标表的名称,例如
myTable
。 如果目标表是现有表,则对于目标表写入偏好设置,请选择是使用查询结果附加表还是覆盖表。
如果目标表是新表,则 BigQuery 会在运行查询时创建表。
在其他设置部分中,点击数据位置菜单,然后选择一个选项。
在此示例中,
usa_names
数据集存储在美国多区域位置。如果您为此查询指定目标表,则包含目标表的数据集也必须位于美国多区域中。您无法查询一个位置的数据集而将结果写入另一个位置的表。点击保存。
点击
运行。如果未指定目标表,则查询作业会将输出写入临时(缓存)表。
可选:如需按列对查询结果进行排序,请点击列名称旁边的
打开排序菜单,然后选择排序顺序。如果针对排序处理的估算字节数大于零,则菜单顶部会显示字节数。可选:如需查看查询结果的可视化效果,请前往图表标签页。您可以放大或缩小图表,将图片下载为 PNG 文件,也可以切换图例的可见性。
在图表配置窗格中,您可以更改图表类型(折线图、条形图或散点图),并配置图表的度量和维度。此窗格中的字段预先填充了从查询的目标表架构推断的初始配置。在同一查询编辑器中的以下查询运行之间会保留配置。维度支持
INTEGER
、INT64
、FLOAT
、FLOAT64
、NUMERIC
、BIGNUMERIC
、TIMESTAMP
、DATE
、DATETIME
、TIME
和STRING
数据类型,而指标支持INTEGER
、INT64
、FLOAT
、FLOAT64
、NUMERIC
和BIGNUMERIC
数据类型。
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
使用
bq query
命令。 在以下示例中,--use_legacy_sql=false
标志可让您使用 GoogleSQL 语法。bq query \ --use_legacy_sql=false \ 'QUERY'
将 QUERY 替换为有效的 GoogleSQL 查询。例如,查询 BigQuery 公开数据集
usa_names
,以确定 1910 年至 2013 年间美国人最常用的名字:bq query \ --use_legacy_sql=false \ 'SELECT name, gender, SUM(number) AS total FROM `bigquery-public-data.usa_names.usa_1910_2013` GROUP BY name, gender ORDER BY total DESC LIMIT 10;'
查询作业将输出写入临时(缓存)表。
(可选)您可以为查询结果指定目标表和位置。如需将结果写入现有表,请添加适当的标志以附加 (
--append_table=true
) 或覆盖 (--replace=true
) 表。bq query \ --location=LOCATION \ --destination_table=TABLE \ --use_legacy_sql=false \ 'QUERY'
请替换以下内容:
LOCATION:目标表的单区域或多区域,例如
US
在此示例中,
usa_names
数据集存储在美国多区域位置。如果您为此查询指定目标表,则包含目标表的数据集也必须位于美国多区域中。您无法查询一个位置的数据集而将结果写入另一个位置的表。您可以使用 .bigqueryrc 文件设置位置的默认值。
TABLE:目标表的名称,例如
myDataset.myTable
如果目标表是新表,则 BigQuery 会在运行查询时创建表。但是,您必须指定现有数据集。
如果该表不在当前项目中,请使用
PROJECT_ID:DATASET.TABLE
格式添加 Google Cloud 项目 ID,例如myProject:myDataset.myTable
。如果未指定--destination_table
,系统会生成一个将输出写入临时表的查询作业。
API
如需使用 API 运行查询,请插入新作业,并填写 query
作业配置属性。(可选)在作业资源 jobReference
部分的 location
属性中指定您的位置。
通过调用 getQueryResults
提取结果,直到 jobComplete
等于 true
。检查 errors
列表中是否存在错误和警告。
C#
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 C# 设置说明进行操作。如需了解详情,请参阅 BigQuery C# API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
如需使用代理运行查询,请参阅配置代理。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
PHP
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。如需了解详情,请参阅 BigQuery PHP API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Ruby
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Ruby 设置说明进行操作。如需了解详情,请参阅 BigQuery Ruby API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
如需了解详情,请参阅交互式查询与批量查询。
运行批量查询
如需运行批量查询,请选择以下任一选项:
控制台
转到 BigQuery 页面。
点击
编写新查询。在查询编辑器中,输入有效的 GoogleSQL 查询。
例如,查询 BigQuery 公开数据集
usa_names
,以确定 1910 年至 2013 年间美国人最常用的名字:SELECT name, gender, SUM(number) AS total FROM `bigquery-public-data.usa_names.usa_1910_2013` GROUP BY name, gender ORDER BY total DESC LIMIT 10;
点击
更多,然后点击查询设置。在资源管理部分,选择批量。
可选:指定查询结果的目标表和位置:
- 在目标位置部分,选择为查询结果设置目标表。
- 在数据集部分,输入目标表的现有数据集的名称,例如
myProject.myDataset
。 - 在表 ID 部分,输入目标表的名称,例如
myTable
。 如果目标表是现有表,则对于目标表写入偏好设置,请选择是使用查询结果附加表还是覆盖表。
如果目标表是新表,则 BigQuery 会在运行查询时创建表。
在其他设置部分中,点击数据位置菜单,然后选择一个选项。
在此示例中,
usa_names
数据集存储在美国多区域位置。如果您为此查询指定目标表,则包含目标表的数据集也必须位于美国多区域中。您无法查询一个位置的数据集而将结果写入另一个位置的表。
点击保存。
点击
运行。如果未指定目标表,则查询作业会将输出写入临时(缓存)表。
可选:如需按列对查询结果进行排序,请点击列名称旁边的
打开排序菜单,然后选择排序顺序。如果针对排序处理的估算字节数大于零,则菜单顶部会显示字节数。可选:如需查看查询结果的可视化效果,请前往图表标签页。您可以放大或缩小图表,将图片下载为 PNG 文件,也可以切换图例的可见性。
在图表配置窗格中,您可以更改图表类型(折线图、条形图或散点图),并配置图表的度量和维度。此窗格中的字段预先填充了从查询的目标表架构推断的初始配置。在同一查询编辑器中的以下查询运行之间会保留配置。维度支持
INTEGER
、INT64
、FLOAT
、FLOAT64
、NUMERIC
、BIGNUMERIC
、TIMESTAMP
、DATE
、DATETIME
、TIME
和STRING
数据类型,而指标支持INTEGER
、INT64
、FLOAT
、FLOAT64
、NUMERIC
和BIGNUMERIC
数据类型。
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
使用
bq query
命令并指定--batch
标志。在以下示例中,--use_legacy_sql=false
标志可让您使用 GoogleSQL 语法。bq query \ --batch \ --use_legacy_sql=false \ 'QUERY'
将 QUERY 替换为有效的 GoogleSQL 查询。例如,查询 BigQuery 公开数据集
usa_names
,以确定 1910 年至 2013 年间美国人最常用的名字:bq query \ --batch \ --use_legacy_sql=false \ 'SELECT name, gender, SUM(number) AS total FROM `bigquery-public-data.usa_names.usa_1910_2013` GROUP BY name, gender ORDER BY total DESC LIMIT 10;'
查询作业将输出写入临时(缓存)表。
(可选)您可以为查询结果指定目标表和位置。如需将结果写入现有表,请添加适当的标志以附加 (
--append_table=true
) 或覆盖 (--replace=true
) 表。bq query \ --batch \ --location=LOCATION \ --destination_table=TABLE \ --use_legacy_sql=false \ 'QUERY'
请替换以下内容:
LOCATION:目标表的单区域或多区域,例如
US
在此示例中,
usa_names
数据集存储在美国多区域位置。如果您为此查询指定目标表,则包含目标表的数据集也必须位于美国多区域中。您无法查询一个位置的数据集而将结果写入另一个位置的表。您可以使用 .bigqueryrc 文件设置位置的默认值。
TABLE:目标表的名称,例如
myDataset.myTable
如果目标表是新表,则 BigQuery 会在运行查询时创建表。但是,您必须指定现有数据集。
如果该表不在当前项目中,请使用
PROJECT_ID:DATASET.TABLE
格式添加 Google Cloud 项目 ID,例如myProject:myDataset.myTable
。如果未指定--destination_table
,系统会生成一个将输出写入临时表的查询作业。
API
如需使用 API 运行查询,请插入新作业,并填写 query
作业配置属性。(可选)在作业资源 jobReference
部分的 location
属性中指定您的位置。
填写查询作业属性时,请包含 configuration.query.priority
属性并将其值设置为 BATCH
。
通过调用 getQueryResults
提取结果,直到 jobComplete
等于 true
。检查 errors
列表中是否存在错误和警告。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
如需运行批量查询,请在创建 QueryJobConfiguration 时将查询优先级设置为 QueryJobConfiguration.Priority.BATCH。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
如需了解详情,请参阅交互式查询与批量查询。
配额
如需了解交互式查询和批量查询的配额,请参阅查询作业。
查看交互式查询和批量查询的数量
您可以使用 INFORMATION_SCHEMA.JOBS_BY_PROJECT
视图查看交互式查询和批量查询的数量。以下示例使用 INFORMATION_SCHEMA.JOBS_BY_PROJECT
视图获取过去 7 小时内运行的交互式查询和批量查询的数量:
SELECT
priority,
COUNT(*) active_jobs,
FROM
`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE
creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 hour)
AND end_time IS NULL
AND job_type = 'QUERY'
GROUP BY priority
INFORMATION_SCHEMA.JOBS_BY_PROJECT
视图使用 priority
字段来指明查询是 INTERACTIVE
还是 BATCH
。如需了解详情,请参阅架构。
执行试运行
BigQuery 中的试运行提供以下信息:
试运行不使用查询槽,您不需要为执行试运行支付费用。您可以使用试运行返回的估算值在价格计算器中计算查询费用。
执行试运行
如需执行试运行,请执行以下操作:
控制台
转到 BigQuery 页面。
在查询编辑器中输入查询。
如果查询有效,则会自动显示一个对勾标记以及查询将处理的数据量。如果查询无效,则会显示一个感叹号,并会显示错误消息。
bq
使用 --dry_run
标志输入如下所示的查询。
bq query \ --use_legacy_sql=false \ --dry_run \ 'SELECT COUNTRY, AIRPORT, IATA FROM `project_id`.dataset.airports LIMIT 1000'
对于有效查询,该命令会生成以下响应:
Query successfully validated. Assuming the tables are not modified, running this query will process 10918 bytes of data.
API
如需使用 API 执行试运行,请提交一项查询作业,并在 JobConfiguration 类型中将 dryRun
设置为 true
。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
PHP
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 PHP 设置说明进行操作。如需了解详情,请参阅 BigQuery PHP API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。
Python
将 QueryJobConfig.dry_run 属性设置为 True
。如果提供了试运行查询配置,Client.query() 将始终返回已完成的 QueryJob。
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证。