管理表数据

本文档介绍如何在 BigQuery 中管理表数据。您可以通过以下方式处理 BigQuery 表数据:

  • 将数据加载到表中
  • 浏览(或预览)表数据
  • 查询表数据
  • 对表数据执行附加或覆盖操作
  • 使用数据操作语言修改表数据
  • 复制表数据
  • 导出表数据

如需了解如何管理表架构,请参阅修改表架构

将数据加载到表中

您可以在创建表时加载数据,也可以先创建空表,然后再加载数据。加载数据时,您可以针对支持的数据格式使用架构自动检测功能,也可以指定架构

如需详细了解如何加载数据,请参阅关于源数据格式和位置的文档:

浏览表数据

您可以通过以下方式浏览表数据:

  • 使用 GCP Console 或传统版 BigQuery 网页界面
  • 使用命令行工具的 bq head 命令
  • 调用 tabledata.list API 方法

所需权限

要在数据集级别浏览表数据,您需要拥有要浏览的表所属数据集的 READER 访问权限。

您可以利用包含 bigquery.tables.getData 权限的项目级层 IAM 角色,而不是使用数据集级层的权限。除了 bigquery.userbigquery.jobUserbigquery.metadataViewer 以外,其他所有预定义的项目级 IAM 角色都拥有 bigquery.tables.getData 权限。

此外,因为 bigquery.user 角色拥有 bigquery.datasets.create 权限,所以分配有 bigquery.user 角色的用户可读取用户创建的任一数据集中任何表的数据。当分配有 bigquery.user 角色的用户创建数据集时,该用户拥有对该数据集的 OWNER 访问权限。凭借对数据集的 OWNER 访问权限,用户可以完全掌控该数据集以及其中的所有表。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅访问权限控制。如需详细了解数据集级层的角色,请参阅数据集的初始角色

浏览表数据

要浏览表数据,请执行以下操作:

Console

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

  2. 在导航面板的资源部分中,展开您的项目并选择数据集。此时会显示数据集中的表和视图。

  3. 点击列表中的表。

  4. 点击详情并记下行数中的值。使用 CLI 或 API 时,您可能需要此值来控制结果的起点。

  5. 点击预览。此时会显示一组数据示例。

    表预览

经典版界面

  1. 在传统版 BigQuery 网页界面的导航窗格中,点击数据集左侧的蓝色箭头展开数据集,或双击数据集名称。系统会显示数据集中的表和视图。

  2. 点击列表中的表。

  3. 点击详情并记下行数中的值。使用 CLI 或 API 时,您可能需要此值来控制结果的起点。

  4. 点击预览。此时会显示一组数据示例。

    表预览

命令行

发出带 --max_rows 标记的 bq head 命令,即可列出特定表行数对应的所有字段。如果未指定 --max_rows,则默认值为 100。

要浏览表中的字段子集(包括嵌套和重复字段),请使用 --selected_fields 标记以逗号分隔列表的形式输入字段。

要指定显示表数据之前跳过的行数,请使用 --start_row=[INTEGER] 标志(或 -s 快捷方式)。默认值为 0。要检索表中的行数,您可以使用 bq show 命令检索表信息

如果要浏览的表位于非默认项目中,请按以下格式将项目 ID 添加到命令:[PROJECT_ID]:[DATASET].[TABLE]

bq head --max_rows [INTEGER1] --start_row [INTEGER2] --selected_fields "[FIELDS]" [PROJECT_ID]:[DATASET].[TABLE]

其中:

  • [INTEGER1] 是要显示的行数。
  • [INTEGER2] 是显示数据之前要跳过的行数。
  • [FIELDS] 是英文逗号分隔的字段列表。
  • [PROJECT_ID] 是您的项目 ID。
  • [DATASET] 是包含该表的数据集的名称。
  • [TABLE] 是要浏览的表名称。

示例:

输入以下命令,列出 mydataset.mytable 中前 10 行的所有字段。mydataset 位于默认项目中。

bq head --max_rows=10 mydataset.mytable

输入以下命令,列出 mydataset.mytable 中前 100 行的所有字段。mydataset 位于 myotherproject 中,而非默认项目中。

bq head myotherproject:mydataset.mytable

输入以下命令,仅显示 mydataset.mytable 中的 field1field2。该命令使用 --start_row 标记跳到第 100 行。 mydataset.mytable 位于默认项目中。

bq head --start_row 100 --selected_fields "field1,field2" mydataset.mytable

因为 bq head 命令不会创建查询作业,所以 bq head 命令不会显示在查询历史记录中,您也无需为此付费。

API

通过调用 tabledata.list 来浏览表数据。在 tableId 参数中指定表的名称。

配置以下可选参数来控制输出:

  • maxResults - 要返回的结果数上限
  • selectedFields - 以英文逗号分隔的待返回字段列表;如果未指定此参数,则返回所有字段
  • startIndex - 要读取的起始行的索引(从零开始)

返回的值会封装在一个 JSON 对象中,您必须对此对象进行解析,具体请参阅 tabledata.list 参考文档。

C#

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

using Google.Api.Gax;
using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;
using System.Collections.Generic;
using System.Linq;

public class BigQueryBrowseTable
{
    public void BrowseTable(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        TableReference tableReference = new TableReference()
        {
            TableId = "shakespeare",
            DatasetId = "samples",
            ProjectId = "bigquery-public-data"
        };
        // Load all rows from a table
        PagedEnumerable<TableDataList, BigQueryRow> result = client.ListRows(
            tableReference: tableReference,
            schema: null
        );
        // Print the first 10 rows
        foreach (BigQueryRow row in result.Take(10))
        {
            Console.WriteLine($"{row["corpus"]}: {row["word_count"]}");
        }
    }
}

Go

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

默认情况下,Go 版 Google Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:

table := client.Dataset(datasetID).Table(tableID)
it := table.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 参考文档

TableId tableIdObject = TableId.of(datasetName, tableName);
// This example reads the result 100 rows per RPC call. If there's no need to limit the number,
// simply omit the option.
TableResult tableData =
    bigquery.listTableData(tableIdObject, TableDataListOption.pageSize(100));
for (FieldValueList row : tableData.iterateAll()) {
  // do something with the row
}

Node.js

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

默认情况下,Node.js 版 Google Cloud 客户端库会自动分页,因此您无需自行实现分页,例如:

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const datasetId = "my_dataset";
// const tableId = "my_table";

async function browseRows() {
  // Displays rows from "my_table" in "my_dataset".

  // Create a client
  const bigqueryClient = new BigQuery();

  // List rows in the table
  const [rows] = await bigqueryClient
    .dataset(datasetId)
    .table(tableId)
    .getRows();

  console.log('Rows:');
  rows.forEach(row => console.log(row));
}

browseRows();

PHP

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

PHP 版 Google Cloud 客户端库会通过生成器函数 rows 在迭代期间获取下一页的结果,从而实现自动分页。

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId   = 'The BigQuery table ID';
// $maxResults = 10;

$maxResults = 10;
$startIndex = 0;

$options = [
    'maxResults' => $maxResults,
    'startIndex' => $startIndex
];
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table($tableId);
$numRows = 0;
foreach ($table->rows($options) as $row) {
    print('---');
    foreach ($row as $column => $value) {
        printf('%s: %s' . PHP_EOL, $column, $value);
    }
    $numRows++;
}

Python

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

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

dataset_ref = client.dataset("samples", project="bigquery-public-data")
table_ref = dataset_ref.table("shakespeare")
table = client.get_table(table_ref)  # API call

# Load all rows from a table
rows = client.list_rows(table)
assert len(list(rows)) == table.num_rows

# Load the first 10 rows
rows = client.list_rows(table, max_results=10)
assert len(list(rows)) == 10

# Specify selected fields to limit the results to certain columns
fields = table.schema[:2]  # first two columns
rows = client.list_rows(table, selected_fields=fields, max_results=10)
assert len(rows.schema) == 2
assert len(list(rows)) == 10

# Use the start index to load an arbitrary portion of the table
rows = client.list_rows(table, start_index=10, max_results=10)

# Print row data in tabular format
format_string = "{!s:<16} " * len(rows.schema)
field_names = [field.name for field in rows.schema]
print(format_string.format(*field_names))  # prints column headers
for row in rows:
    print(format_string.format(*row))  # prints row data

Ruby

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

Ruby 版 Google Cloud 客户端库会通过 Table#dataData#next 实现自动分页。

require "google/cloud/bigquery"

def browse_table
  bigquery = Google::Cloud::Bigquery.new project_id: "bigquery-public-data"
  dataset  = bigquery.dataset "samples"
  table    = dataset.table "shakespeare"

  # Load all rows from a table
  rows = table.data

  # Load the first 10 rows
  rows = table.data max: 10

  # Print row data
  rows.each { |row| puts row }
end

查询表数据

将数据加载到 BigQuery 中后,您可以查询表中的数据。BigQuery 支持两种类型的查询:

默认情况下,BigQuery 运行交互式查询,也就是说查询会尽快执行。

BigQuery 也可运行批量查询。BigQuery 会代表您将每个批量查询排成队列,并在有闲置资源可用时尽快开始查询,这通常需要几分钟的时间。

您可以通过以下方式运行交互式查询和批量查询:

如需详细了解如何查询 BigQuery 表,请参阅查询 BigQuery 数据简介

除了查询存储在 BigQuery 表中的数据外,您还可以查询存储在外部的数据。如需了解详情,请参阅外部数据源简介

对表数据执行附加和覆盖操作

您可以使用加载或查询操作覆盖表数据。您可以通过执行加载附加操作或将查询结果附加到表,将其他数据附加到现有表。

要详细了解如何在加载数据时对表执行附加或覆盖操作,请参阅关于源数据格式的文档:

要使用查询结果覆盖或附加到表,请指定目标表并将写入配置设置为以下某项:

  • Append to table - 将查询结果附加到现有表。
  • Overwrite table - 使用查询结果覆盖名称相同的现有表。

如需详细了解如何使用查询结果对表执行数据附加或覆盖操作,请参阅编写查询结果

修改表数据

通过标准 SQL 方言,您可以使用 DML 语句修改表中的数据。DML 语句可让您执行批量行更新、插入和删除操作。如需有关使用 DML 的示例,请参阅使用数据操纵语言更新表数据

旧版 SQL 方言不支持 DML 语句。要使用旧版 SQL 更新或删除数据,您必须先删除表,然后使用新数据重新创建该表。您也可以通过编写查询修改数据,并将查询结果写入新的目标表。

复制表数据

您可以通过以下方式复制表:

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

如需详细了解如何复制表,请参阅复制表

导出表数据

您可以采用 CSV、JSON 或 Avro 格式导出表数据。目前,数据必须导出到 Cloud Storage 存储分区。不支持导出到本地机器;但是,您可以使用 GCP Console 或传统版 BigQuery 网页界面下载和保存查询结果

如需了解详情,请参阅导出表数据

后续步骤

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

发送以下问题的反馈:

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