写入查询结果

本文档介绍了如何写入或保存查询结果。

临时表和永久表

BigQuery 将所有查询结果保存到表中,该表可以是永久表,也可以是临时表:

  • 临时表是保存在特殊数据集中的随机命名表。临时表用于缓存查询结果。临时表的生命周期约为 24 小时。临时表不可用于共享,并且使用任何标准列表或其他表操纵方法时均无法看到临时表。您不需要为存储临时表支付费用。

  • 永久表可以是您有权访问的任何数据集中的新表或现有表。如果将查询结果写入新表,那么您就需要为存储数据支付费用。将查询结果写入永久表时,需要查询的表必须与目标表所在的数据集位于相同的位置。

所需权限

如需将查询结果写入表中,您至少必须具有以下权限:

  • bigquery.tables.create:创建新表的权限
  • bigquery.tables.updateData:将数据写入新表、覆盖表或将数据附加到表
  • bigquery.jobs.create:运行查询作业

如需访问要查询的数据,可能还需要其他权限,例如 bigquery.tables.getData

以下预定义的 Cloud IAM 角色包含 bigquery.tables.createbigquery.tables.updateData 权限:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

以下预定义的 Cloud IAM 角色包含 bigquery.jobs.create 权限:

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

此外,如果用户具有 bigquery.datasets.create 权限,则当该用户创建数据集时,系统会为其授予该数据集的 bigquery.dataOwner 访问权限。 借助 bigquery.dataOwner 访问权限,用户可以在数据集中创建和更新表。

如需详细了解 BigQuery 中的 Cloud IAM 角色和权限,请参阅访问权限控制

将查询结果写入永久表

将查询结果写入永久表时,您可以创建新表,将结果附加到现有表,或覆盖现有表。您可以通过以下方式将查询结果写入永久表:

  • 使用 GCP Console 或经典版 BigQuery 网页界面
  • 使用命令行工具的 bq query 命令
  • 调用 jobs.insert API 方法并配置 query 作业
  • 使用客户端库

写入查询结果

如需将查询结果写入永久表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。

    转到 GCP Console

  2. 在导航面板的资源部分中,展开您的项目并选择数据集。

  3. 如果查询编辑器隐藏,请点击窗口右上角的显示编辑器

  4. 查询编辑器文本区域中输入有效的 SQL 查询。

  5. 点击编辑器下方的更多,然后选择查询设置

    查询设置

  6. 勾选该方框,为查询结果设置目标表

    设置目标位置

  7. 目标位置部分,选择要在其中创建表的相应项目名称数据集名称,然后选择表名称

  8. 目标表的写入设置部分,选择以下选项之一:

    • 只写入空白表 - 仅在表为空时才将查询结果写入表。
    • 附加到表 - 将查询结果附加到现有表。
    • 覆盖表 - 使用查询结果覆盖名称相同的现有表。
  9. (可选)在处理位置部分,点击自动选择并选择您的位置

  10. 点击运行查询。这会创建一个查询作业,并将查询结果写入您指定的表中。

或者,如果在运行查询之前忘记指定目标表,您可以将缓存的结果表复制到永久表,只需点击编辑器下方的保存结果按钮即可。

DDL

通过数据定义语言 (DDL) 语句,您可以使用标准 SQL 查询语法创建和修改表。

如需了解详情,请参阅 CREATE TABLE 语句页面和 CREATE TABLE 示例:从现有表创建新表

经典版界面

  1. 转到经典版 BigQuery 网页界面。
    转到经典版 BigQuery 网页界面

  2. 点击 Compose query 按钮。

  3. New Query 文本区域中输入有效的 SQL 查询。

  4. 点击 Show Options

  5. Destination Table 部分,点击 Select Table

  6. Select Destination Table 对话框中,执行以下操作:

    1. 对于 Project,选择一个用于存储数据集和表的项目。

    2. 对于 Dataset,选择要用于存储该表的数据集。

    3. Table ID 字段中,输入表名称。该名称在目标数据集中必须是唯一的。表名称最长可达 1024 个字符,并且只能包含 a-z、A-Z、0-9 或 _(下划线字符)。

    4. 点击 OK

  7. Destination Table 部分的 Write Preference 中,选择以下某个选项:

    • Write if empty - 仅在表为空时才将查询结果写入表。
    • Append to table - 将查询结果附加到现有表。
    • Overwrite table - 使用查询结果覆盖名称相同的现有表。
  8. (可选)在 Processing Location 部分,点击 Unspecified 并选择数据的位置

  9. 点击 Run query。这会创建一个查询作业,并将查询结果写入您指定的表中。

或者,如果在运行查询之前忘记指定目标表,您可以将临时表复制到永久表,只需点击结果窗口中的 Save as Table 按钮即可。

CLI

输入 bq query 命令并指定 --destination_table 标志,可基于查询结果创建一个永久表。指定 use_legacy_sql=false 标志以使用标准 SQL 语法。如需将查询结果写入非默认项目中的某个表,请按此格式将相应项目 ID 添加到数据集名称中:project_id:dataset

(可选)添加 --location 标志并将值设置为您的位置

如需控制现有目标表的写入处置方式,请指定下述可选标志之一:

  • --append_table - 如果目标表已存在,则系统会将查询结果附加到该表。
  • --replace - 如果目标表已存在,则系统会用查询结果覆盖该表。
bq --location=location query \
--destination_table project_id:dataset.table \
--use_legacy_sql=false 'query'

其中:

  • location 是用于处理查询的位置的名称。--location 是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设为 asia-northeast1。您可以使用 .bigqueryrc 文件设置默认位置值。
  • project_id 是您的项目 ID。
  • dataset 是数据集的名称,此数据集包含您要向其中写入查询结果的表。
  • table 是您要向其中写入查询结果的表的名称。
  • query 是使用标准 SQL 语法的查询。

如果未指定“写入处置方式”标志,则默认行为是仅在表为空时写入结果。如果表已存在且非空,则系统返回以下错误:`BigQuery error in query operation: Error processing job project_id:bqjob_123abc456789_00000e1234f_1': Already Exists: Table project_id:dataset.table

示例:

输入以下命令,将查询结果写入 mydataset 中名为 mytable 的目标表。该数据集在默认项目中。由于命令中未指定“写入处置方式”标志,因此该表必须为新表或空表。否则,系统会返回 Already exists 错误。该查询从美国名字数据公开数据集中检索数据。

bq query \
--destination_table mydataset.mytable \
--use_legacy_sql=false \
'SELECT
  name,
  number
FROM
  `bigquery-public-data`.usa_names.usa_1910_current
WHERE
  gender = "M"
ORDER BY
  number DESC'

输入以下命令,使用查询结果覆盖 mydataset 中名为 mytable 的目标表。该数据集在默认项目中。该命令使用 --replace 标志覆盖目标表。

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
   name,
   number
 FROM
   `bigquery-public-data`.usa_names.usa_1910_current
 WHERE
   gender = "M"
 ORDER BY
   number DESC'
 

输入以下命令,将查询结果附加到 mydataset 中名为 mytable 的目标表。该数据集在 my-other-project 中,不在默认项目中。该命令使用 --append 标志将查询结果附加到目标表。

bq query \
--append \
--use_legacy_sql=false \
--destination_table my-other-project:mydataset.mytable \
'SELECT
   name,
   number
 FROM
   `bigquery-public-data`.usa_names.usa_1910_current
 WHERE
   gender = "M"
 ORDER BY
   number DESC'
 

每个示例的输出如下所示。为确保可读性,一些输出被截断。

Waiting on bqjob_r123abc456_000001234567_1 ... (2s) Current status: DONE
+---------+--------+
|  name   | number |
+---------+--------+
| Robert  |  10021 |
| John    |   9636 |
| Robert  |   9297 |
| ...              |
+---------+--------+

API

如需将查询结果保存到永久表中,请调用 jobs.insert 方法,配置一项 query 作业,并为 destinationTable 属性添加一个值。如需控制现有目标表的写入处置方式,请配置 writeDisposition 属性。

如需控制查询作业的处理位置,请在作业资源jobReference 部分中指定 location 属性。

Go

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")

q := client.Query("SELECT 17 as my_col")
q.Location = "US" // Location must match the dataset(s) referenced in query.
q.QueryConfig.Dst = client.Dataset(destDatasetID).Table(destTableID)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Java

在尝试此示例之前,请先按照《BigQuery 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

如需将查询结果保存到永久表中,请在 QueryJobConfiguration 中将目标表设置为所需的 TableId

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// String destinationDataset = 'my_destination_dataset';
// String destinationTable = 'my_destination_table';
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // Note that setUseLegacySql is set to false by default
    QueryJobConfiguration.newBuilder(query)
        // Save the results of the query to a permanent table.
        .setDestinationTable(TableId.of(destinationDataset, destinationTable))
        .build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Python

在尝试此示例之前,请先按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

如需将查询结果保存到永久表中,请创建 QueryJobConfig 并将目标设置为所需的 TableReference。将作业配置传递给查询方法

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'your_dataset_id'

job_config = bigquery.QueryJobConfig()
# Set the destination table
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""

# Start the query, passing in the extra configuration.
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish
print('Query results loaded to table {}'.format(table_ref.path))

写入大型查询结果

通常,查询具有一个响应大小上限。如果您计划运行可能返回大型结果的查询,可以采取以下措施:

  • 在标准 SQL 中,为查询结果指定目标表。
  • 在旧版 SQL 中,指定目标表并设置 allowLargeResults 选项。

为大型查询结果指定目标表时,您需要为存储数据支付费用。

限制

在旧版 SQL中,写入大型结果受到以下限制:

  • 您必须指定目标表。
  • 您不能指定顶级 ORDER BYTOPLIMIT 子句。如果指定这些子句,就无法再并行计算查询输出,导致使用 allowLargeResults 的优势被抵消。
  • 只有在与 PARTITION BY 子句配合使用时,窗口函数才能返回大型查询结果。

使用旧版 SQL 写入大型结果

使用旧版 SQL 写入大型结果集的方法如下:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

  3. 查询编辑器文本区域中输入有效的 SQL 查询。使用 #legacySQL 前缀,或务必在查询设置中选中使用旧版 SQL

  4. 点击更多,然后选择查询设置

    查询设置

  5. 目标位置部分,勾选为查询结果设置目标表

    设置目标位置

  6. 项目名称部分,选择将在其中创建目标表的项目。

  7. 数据集名称部分,选择将存储表的数据集。

  8. 表名称字段中,输入表名称。

  9. 如需将大型结果集写入现有表,您可以使用目标表的写入设置选项控制目标表的写入处置方式:

    • 只写入空白表:仅在表为空时才将查询结果写入表。
    • 附加到表:将查询结果附加到现有表。
    • 覆盖表:使用查询结果覆盖名称相同的现有表。

    “覆盖表”单选按钮

  10. 结果大小部分,勾选允许大型结果(无大小限制)

    查询结果大小

  11. (可选)在处理位置部分,点击自动选择并选择数据的位置

    查询处理位置

  12. 点击保存以更新查询设置。

  13. 点击运行。这会创建一个查询作业,并将大型结果集写入您指定的表中。

经典版界面

  1. 转到 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 点击 Compose query 按钮。

  3. New Query 文本区域中输入有效的 BigQuery SQL 查询。使用 #legacySQL 前缀,或务必在查询选项中选中 Use Legacy SQL

  4. 点击 Show Options

  5. Destination Table 部分,点击 Select Table

  6. Select Destination Table 对话框中,执行以下操作:

    1. 对于 Project,选择要在哪个项目中创建目标表。

    2. 对于 Project,选择要用于存储该表的数据集。

    3. Table ID 字段中,输入表名称。

    4. 点击 OK

  7. 如需将大型结果集写入现有表,可以使用 Write Preference 选项来控制目标表的写入处置方式:

    • Write if empty - 仅在表为空时才将查询结果写入表。
    • Append to table - 将查询结果附加到现有表。
    • Overwrite table - 使用查询结果覆盖名称相同的现有表。
  8. 对于 Results Size,选中 Allow Large Results

    “允许大型结果”选项

  9. (可选)在 Processing Location 部分,点击 Unspecified 并选择数据的位置

  10. 点击 Run Query。这会创建一个查询作业,并将大型结果集写入您指定的表中。

CLI

--allow_large_results 标志与 --destination_table 标志配合使用,以创建存储大型结果集的目标表。由于 -- allow_large_results 选项仅应用于旧版 SQL,因此您还必须指定 --use_legacy_sql=true 标志。如需将查询结果写入非默认项目中的某个表,请按此格式将相应项目 ID 添加到数据集名称中:[PROJECT_ID]:[DATASET]。添加 -- location 标志并将值设置为您的位置

如需控制现有目标表的写入处置方式,请指定下述可选标志之一:

  • --append_table - 如果目标表已存在,则系统会将查询结果附加到该表。
  • --replace - 如果目标表已存在,则系统会用查询结果覆盖该表。
bq --location=location query \
--destination_table project_id:dataset.table \
--use_legacy_sql=true \
--allow_large_results "query"

其中:

  • location 是用于处理查询的位置的名称。--location 是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设为 asia-northeast1。您可以使用 .bigqueryrc 文件设置该位置的默认值。
  • project_id 是您的项目 ID。
  • dataset 是数据集名称,该数据集包含您要向其中写入查询结果的表。
  • table 是您要向其中写入查询结果的表的名称。
  • query 是使用旧版 SQL 语法的查询。

示例:

输入以下命令,将大型查询结果写入 mydataset 中名为 mytable 的目标表。该数据集在默认项目中。由于命令中未指定“写入处置方式”标志,因此该表必须为新表或空表。否则,系统会返回 Already exists 错误。该查询从美国名字数据公开数据集中检索数据。该查询仅用于举例。所返回的结果集不超过响应大小上限。

bq query \
--destination_table mydataset.mytable \
--use_legacy_sql=true \
--allow_large_results \
"SELECT
  name,
  number
FROM
  [bigquery-public-data:usa_names.usa_1910_current]
WHERE
  gender = 'M'
ORDER BY
  number DESC"

输入以下命令,使用大型查询结果覆盖 mydataset 中名为 mytable 的目标表。该数据集在 myotherproject 中,不在默认项目中。该命令使用 --replace 标志覆盖目标表。

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=true \
--allow_large_results \
"SELECT
  name,
  number
FROM
  [bigquery-public-data:usa_names.usa_1910_current]
WHERE
  gender = 'M'
ORDER BY
  number DESC"

输入以下命令,将大型查询结果附加到 mydataset 中名为 mytable 的目标表。该数据集属于 myotherproject,而非默认项目。该命令使用 --append 标志将查询结果附加到目标表。

bq query \
--destination_table myotherproject:mydataset.mytable \
--append \
--use_legacy_sql=true \
--allow_large_results \
"SELECT
  name,
  number
FROM
  [bigquery-public-data:usa_names.usa_1910_current]
WHERE
  gender = 'M'
ORDER BY
  number DESC"

API

如需将大型结果写入目标表,请调用 jobs.insert 方法,配置一项 query 作业,并将 allowLargeResults 属性设置为 true。使用 destinationTable 属性指定目标表。如需控制现有目标表的写入处置方式,请配置 writeDisposition 属性。

作业资源jobReference 部分的 location 属性中,指定您的位置。

Go

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

q := client.Query(
	"SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;")
q.UseLegacySQL = true
q.AllowLargeResults = true
q.QueryConfig.Dst = client.Dataset(dstDatasetID).Table(dstTableID)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Java

如需启用大型结果,请在 QueryJobConfiguration 中将允许大型结果设置为 true,并将目标表设置为所需的 TableId

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// String destinationDataset = 'my_destination_dataset';
// String destinationTable = 'my_destination_table';
String query = "SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // To use legacy SQL syntax, set useLegacySql to true.
    QueryJobConfiguration.newBuilder(query)
        .setUseLegacySql(true)
        // Save the results of the query to a permanent table.
        .setDestinationTable(TableId.of(destinationDataset, destinationTable))
        // Allow results larger than the maximum response size.
        // If true, a destination table must be set.
        .setAllowLargeResults(true)
        .build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Python

在尝试此示例之前,请先按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'your_dataset_id'

job_config = bigquery.QueryJobConfig()
# Set use_legacy_sql to True to use legacy SQL syntax.
job_config.use_legacy_sql = True
# Set the destination table
table_ref = client.dataset(dataset_id).table("your_table_id")
job_config.destination = table_ref
job_config.allow_large_results = True
sql = """
    SELECT corpus
    FROM [bigquery-public-data:samples.shakespeare]
    GROUP BY corpus;
"""
# Start the query, passing in the extra configuration.
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location="US",
    job_config=job_config,
)  # API request - starts the query

query_job.result()  # Waits for the query to finish
print("Query results loaded to table {}".format(table_ref.path))

下载和保存查询结果

运行 SQL 查询后,您可以将结果下载到本地机器上的文件中,也可保存到 Google 云端硬盘、Google 表格,或者 BigQuery 中的永久表中。

限制

查询结果的下载和保存受到以下限制:

  • 在经典版 BigQuery 网页界面上,您只能将查询结果下载到本地文件或 Google 表格中。如需将结果下载到 Google 云端硬盘,请使用 GCP Console。
  • 如需使用经典版 BigQuery 网页界面下载查询结果,结果集包含的行数必须少于 16000 行,且大小必须为 10 MB 或以下。如果结果大于 10 MB 或超过 16000 行,则可以将其保存到表中。
  • 您只能以 CSV 或换行符分隔的 JSON 格式在本地下载查询结果。
  • 不能以 CSV 格式下载包含嵌套和重复数据的查询结果。
  • 不能将包含嵌套和重复数据的查询结果保存到 Google 表格。
  • 使用经典版 BigQuery 网页界面将查询结果保存到 Google 表格时,结果集包含的行数必须少于 16000 行,且大小必须为 10 MB 或以下。如果结果大于 10 MB 或超过 16000 行,则可以改为保存到表中。
  • 命令行工具或 API 不支持将结果保存到本地文件、Google 表格或 Google 云端硬盘。
  • 如需使用 GCP Console 将查询结果保存到 Google 云端硬盘,结果集的大小必须为 1 GB 或以下。如果结果大于 1 GB,则可以改为保存到表中。
  • 您只能以 CSV 或换行符分隔的 JSON 格式将查询结果保存到 Google 云端硬盘。

将查询结果下载到本地文件

命令行工具或 API 不支持将查询结果下载到本地文件。

如需使用网页界面以 CSV 或换行符分隔的 JSON 文件格式下载查询结果,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

  3. 查询编辑器文本区域中输入有效的 SQL 查询。

  4. (可选)如需更改处理位置,请点击更多并选择查询设置。在处理位置下,点击自动选择并选择数据的位置

  5. 点击运行

  6. 返回结果后,点击保存结果,并选择要保存结果的格式/位置。

    此时文件会下载到您浏览器的默认下载位置。

经典版界面

  1. 转到 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 点击 Compose Query 按钮。

  3. New Query 文本区域中输入有效的 SQL 查询。

  4. 点击 Show Options

  5. (可选)在 Processing Location 部分,点击 Unspecified 并选择数据的位置

  6. 点击 Run Query

  7. 结果返回后,点击查询结果上方的 Download as CSVDownload as JSON 按钮。

    “下载”按钮和“保存”按钮的屏幕截图

    此时文件会下载到您浏览器的默认下载位置。

将查询结果保存到 Google 云端硬盘

命令行工具、API 或经典版 BigQuery 网页界面不支持将查询结果保存到 Google 云端硬盘。

如需使用 GCP Console 将查询结果保存到 Google 云端硬盘,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。

    转到 GCP Console

  2. 查询编辑器文本区域中输入有效的 SQL 查询。

  3. 点击运行

  4. 返回结果后,点击保存结果

    “保存结果”按钮的屏幕截图

  5. 选择 CSV(Google 云端硬盘)JSON(Google 云端硬盘)。将结果保存到 Google 云端硬盘时,您无法选择位置。结果始终保存到根目录“My Drive”位置。

  6. 将结果保存到 Google 云端硬盘可能需要几分钟时间。结果保存后,您会收到一条弹出消息,其中包含文件名 - bq-results-[TIMESTAMP]-[RANDOM_CHARACTERS].[CSV or JSON]

    “保存结果”按钮的屏幕截图

  7. 在弹出消息中,点击打开以打开文件,或导航到 Google 云端硬盘并点击 My Drive

将查询结果保存到表中

如需将查询结果保存为表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。

    转到 GCP Console

  2. 在导航面板的资源部分中,展开您的项目并选择数据集。

  3. 如果查询编辑器隐藏,请点击窗口右上角的显示编辑器

  4. 查询编辑器文本区域中输入有效的 SQL 查询。

  5. 点击编辑器下方的更多,然后选择查询设置

    查询设置

  6. 勾选该方框,为查询结果设置目标表

    设置目标位置

  7. 目标位置部分,选择要在其中创建表的相应项目名称数据集名称,然后选择表名称

  8. 目标表的写入设置部分,选择以下选项之一:

    • 只写入空白表 - 仅在表为空时才将查询结果写入表。
    • 附加到表 - 将查询结果附加到现有表。
    • 覆盖表 - 使用查询结果覆盖名称相同的现有表。
  9. (可选)在处理位置部分,点击自动选择并选择您的位置

  10. 点击运行查询。这会创建一个查询作业,并将查询结果写入您指定的表中。

或者,如果在运行查询之前忘记指定目标表,您可以将缓存的结果表复制到永久表,只需点击编辑器下方的保存结果按钮即可。

DDL

通过数据定义语言 (DDL) 语句,您可以使用标准 SQL 查询语法创建和修改表。

如需了解详情,请参阅 CREATE TABLE 语句页面和 CREATE TABLE 示例:从现有表创建新表

经典版界面

  1. 转到经典版 BigQuery 网页界面。
    转到经典版 BigQuery 网页界面

  2. 点击 Compose query 按钮。

  3. New Query 文本区域中输入有效的 SQL 查询。

  4. 点击 Show Options

  5. Destination Table 部分,点击 Select Table

  6. Select Destination Table 对话框中,执行以下操作:

    1. 对于 Project,选择一个用于存储数据集和表的项目。

    2. 对于 Dataset,选择要用于存储该表的数据集。

    3. Table ID 字段中,输入表名称。该名称在目标数据集中必须是唯一的。表名称最长可达 1024 个字符,并且只能包含 a-z、A-Z、0-9 或 _(下划线字符)。

    4. 点击 OK

  7. Destination Table 部分的 Write Preference 中,选择以下某个选项:

    • Write if empty - 仅在表为空时才将查询结果写入表。
    • Append to table - 将查询结果附加到现有表。
    • Overwrite table - 使用查询结果覆盖名称相同的现有表。
  8. (可选)在 Processing Location 部分,点击 Unspecified 并选择数据的位置

  9. 点击 Run query。这会创建一个查询作业,并将查询结果写入您指定的表中。

或者,如果在运行查询之前忘记指定目标表,您可以将临时表复制到永久表,只需点击结果窗口中的 Save as Table 按钮即可。

CLI

输入 bq query 命令并指定 --destination_table 标志,可基于查询结果创建一个永久表。指定 use_legacy_sql=false 标志以使用标准 SQL 语法。如需将查询结果写入非默认项目中的某个表,请按此格式将相应项目 ID 添加到数据集名称中:project_id:dataset

(可选)添加 --location 标志并将值设置为您的位置

如需控制现有目标表的写入处置方式,请指定下述可选标志之一:

  • --append_table - 如果目标表已存在,则系统会将查询结果附加到该表。
  • --replace - 如果目标表已存在,则系统会用查询结果覆盖该表。
bq --location=location query \
--destination_table project_id:dataset.table \
--use_legacy_sql=false 'query'

其中:

  • location 是用于处理查询的位置的名称。--location 是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设为 asia-northeast1。您可以使用 .bigqueryrc 文件设置默认位置值。
  • project_id 是您的项目 ID。
  • dataset 是数据集的名称,此数据集包含您要向其中写入查询结果的表。
  • table 是您要向其中写入查询结果的表的名称。
  • query 是使用标准 SQL 语法的查询。

如果未指定“写入处置方式”标志,则默认行为是仅在表为空时写入结果。如果表已存在且非空,则系统返回以下错误:`BigQuery error in query operation: Error processing job project_id:bqjob_123abc456789_00000e1234f_1': Already Exists: Table project_id:dataset.table

示例:

输入以下命令,将查询结果写入 mydataset 中名为 mytable 的目标表。该数据集在默认项目中。由于命令中未指定“写入处置方式”标志,因此该表必须为新表或空表。否则,系统会返回 Already exists 错误。该查询从美国名字数据公开数据集中检索数据。

bq query \
--destination_table mydataset.mytable \
--use_legacy_sql=false \
'SELECT
  name,
  number
FROM
  `bigquery-public-data`.usa_names.usa_1910_current
WHERE
  gender = "M"
ORDER BY
  number DESC'

输入以下命令,使用查询结果覆盖 mydataset 中名为 mytable 的目标表。该数据集在默认项目中。该命令使用 --replace 标志覆盖目标表。

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
   name,
   number
 FROM
   `bigquery-public-data`.usa_names.usa_1910_current
 WHERE
   gender = "M"
 ORDER BY
   number DESC'
 

输入以下命令,将查询结果附加到 mydataset 中名为 mytable 的目标表。该数据集在 my-other-project 中,不在默认项目中。该命令使用 --append 标志将查询结果附加到目标表。

bq query \
--append \
--use_legacy_sql=false \
--destination_table my-other-project:mydataset.mytable \
'SELECT
   name,
   number
 FROM
   `bigquery-public-data`.usa_names.usa_1910_current
 WHERE
   gender = "M"
 ORDER BY
   number DESC'
 

每个示例的输出如下所示。为确保可读性,一些输出被截断。

Waiting on bqjob_r123abc456_000001234567_1 ... (2s) Current status: DONE
+---------+--------+
|  name   | number |
+---------+--------+
| Robert  |  10021 |
| John    |   9636 |
| Robert  |   9297 |
| ...              |
+---------+--------+

API

如需将查询结果保存到永久表中,请调用 jobs.insert 方法,配置一项 query 作业,并为 destinationTable 属性添加一个值。如需控制现有目标表的写入处置方式,请配置 writeDisposition 属性。

如需控制查询作业的处理位置,请在作业资源jobReference 部分中指定 location 属性。

Go

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")

q := client.Query("SELECT 17 as my_col")
q.Location = "US" // Location must match the dataset(s) referenced in query.
q.QueryConfig.Dst = client.Dataset(destDatasetID).Table(destTableID)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Java

在尝试此示例之前,请先按照《BigQuery 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

如需将查询结果保存到永久表中,请在 QueryJobConfiguration 中将目标表设置为所需的 TableId

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// String destinationDataset = 'my_destination_dataset';
// String destinationTable = 'my_destination_table';
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // Note that setUseLegacySql is set to false by default
    QueryJobConfiguration.newBuilder(query)
        // Save the results of the query to a permanent table.
        .setDestinationTable(TableId.of(destinationDataset, destinationTable))
        .build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Python

在尝试此示例之前,请先按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

如需将查询结果保存到永久表中,请创建 QueryJobConfig 并将目标设置为所需的 TableReference。将作业配置传递给查询方法

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'your_dataset_id'

job_config = bigquery.QueryJobConfig()
# Set the destination table
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""

# Start the query, passing in the extra configuration.
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish
print('Query results loaded to table {}'.format(table_ref.path))

将查询结果保存到 Google 表格

命令行工具或 API 不支持将查询结果保存到 Google 表格。

如需使用网页界面将查询结果保存到 Google 表格,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 点击编写新查询

  3. 查询编辑器文本区域中输入有效的 SQL 查询。

  4. (可选)如需更改处理位置,请点击更多并选择查询设置。在处理位置下,点击自动选择并选择数据的位置

  5. 点击运行

  6. 返回结果后,点击保存结果,并选择 Google 表格

  7. 如有必要,请按照系统提示登录到您的 Google 帐号,然后点击允许以授予 BigQuery 相应的权限,使其能够将数据写入您的 Google 云端硬盘的 MY Drive 文件夹。

    按照系统提示操作后,您应该会收到一封主题为“BigQuery 客户端工具已连接到您的 Google 帐号”(BigQuery Client Tools connected to your Google Account) 的电子邮件。这封电子邮件包含有关您已授予的权限的信息以及移除权限的步骤。

  8. 保存结果后,Console BigQuery 网页界面中的查询结果下方会显示如下消息:Saved to Sheets as "results-20190225-103531. Open。您可以点击消息中的链接以在 Google 表格中查看您的结果,也可以导航到 My Drive 文件夹并手动打开文件。

    将查询结果保存到 Google 表格时,文件名会以 results-[DATE] 开头,其中 [DATE] 是当前日期(格式为 YYYYMMDD)。

经典版界面

  1. 转到 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 点击 Compose Query 按钮。

  3. New Query 文本区域中输入有效的 SQL 查询。

  4. 点击 Show Options

  5. (可选)在 Processing Location 部分,点击 Unspecified 并选择数据的位置

  6. 点击 Run Query

  7. 结果返回后,点击查询结果上方的 Save to Google Sheets 按钮。

    “下载”按钮和“保存”按钮的屏幕截图

  8. 如有必要,请按照系统提示登录到您的 Google 帐号,然后点击 Allow 以授予 BigQuery 相应的权限,使其能够将数据写入您的 Google 云端硬盘的 MY Drive 文件夹。

    按照系统提示操作后,您应该会收到一封主题为“BigQuery 客户端工具已连接到您的 Google 帐号”(BigQuery Client Tools connected to your Google Account) 的电子邮件。这封电子邮件包含有关您已授予的权限的信息以及移除权限的步骤。

  9. 保存结果后,经典版 BigQuery 网页界面中的查询结果上方会显示如下消息:Results saved to Google Sheets. Click to view。您可以点击消息中的链接以在 Google 表格中查看您的结果,也可以导航到 MY Drive 文件夹并手动打开文件。

    将查询结果保存到 Google 表格时,文件名会以 results-[DATE] 开头,其中 [DATE] 是当前日期(格式为 YYYYMMDD)。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面