管理資料表資料

本文件說明如何透過 BigQuery 管理資料表資料。 您可以透過以下方法使用 BigQuery 資料表資料:

  • 將資料載入資料表
  • 瀏覽 (或預覽) 資料表資料
  • 查詢資料表資料
  • 附加或覆寫資料表資料
  • 使用資料操縱語言修改資料表資料
  • 複製資料表資料
  • 匯出資料表資料

如需管理資料表結構的詳細資訊,請參閱修改資料表結構一文。

將資料載入資料表

您可以在建立資料表時載入資料,或是先建立空白的資料表,之後再載入資料。載入資料時,您可以使用結構定義自動偵測功能找出支援的資料格式,也可以指定結構定義

如要深入瞭解如何載入資料,請參閱說明文件以瞭解來源資料的格式與位置:

瀏覽資料表資料

您可以透過下列方式瀏覽資料表資料:

  • 使用 GCP 主控台或傳統 BigQuery 網頁版 UI
  • 使用指令列工具的 bq head 指令
  • 呼叫 tabledata.list API 方法

所需權限

如要在資料集層級瀏覽資料表資料,您需要擁有該資料表所屬資料集的 READER 存取權。

如果不使用資料集層級權限,您可以使用擁有 bigquery.tables.getData 權限的專案層級 IAM 角色。所有預先定義的專案層級身分與存取權管理角色都具備 bigquery.tables.getData 權限,但 bigquery.userbigquery.jobUserbigquery.metadataViewer 除外

此外,因為 bigquery.user 角色擁有 bigquery.datasets.create 權限,所以獲指派 bigquery.user 角色的使用者就能讀取自己建立的任一資料集中任何資料表的資料。當接受 bigquery.user 角色指派的使用者建立資料集時,該使用者即被授予資料集的 OWNER 存取權。資料集的 OWNER 存取權可讓使用者完全控管該資料集,以及其中的所有資料表。

如要深入瞭解 BigQuery 中的 IAM 角色和權限,請參閱存取權控管一文。如要深入瞭解資料集層級角色,請參閱資料集的原始角色一節。

瀏覽資料表資料

如要瀏覽資料表資料:

主控台

  1. 在 GCP 主控台中開啟 BigQuery 網頁版 UI。
    前往 BigQuery 網頁版 UI

  2. 在導覽面板的「Resources」(資源) 部分,展開您的專案並選取資料集。如此即會顯示資料集裡的資料表和檢視畫面。

  3. 按一下清單中的資料表。

  4. 按一下 [Details] (詳細資料) 並記下 [Number of Rows] (列數) 中的值。使用 CLI 或 API 時,您可能需要這個值來控管結果的起點。

  5. 按一下 [Preview] (預覽)。畫面上會顯示一組資料範例。

    資料表預覽

傳統版 UI

  1. 在傳統 BigQuery 網頁版 UI 的導覽窗格中,按一下資料集左側的藍色箭頭以展開選單,或按兩下資料集名稱。如此即會顯示資料集裡的資料表和資料畫面。

  2. 按一下清單中的資料表。

  3. 按一下 [Details] (詳細資料) 並記下 [Number of Rows] (列數) 中的值。使用 CLI 或 API 時,您可能需要這個值控管結果的起點。

  4. 按一下 [Preview] (預覽)。畫面上會顯示一組資料範例。

    資料表預覽

指令列

發出 bq head 指令並搭配使用 --max_rows 標記,即可列出特定資料表列數中的所有欄位。如果沒有指定 --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 主控台或傳統 BigQuery 網頁版 UI
  • 使用指令列工具的 bq cp 指令
  • 呼叫 jobs.insert API 方法並設定複製工作

如要深入瞭解如何複製資料表,請參閱複製資料表一節。

匯出資料表資料

您可以使用 CSV、JSON 或 Avro 格式匯出資料表資料。目前,您必須將資料匯出至 Cloud Storage 值區。系統不支援匯出至您的本機電腦;但您可透過 GCP 主控台或傳統 BigQuery 網頁版 UI 下載和儲存查詢結果

詳情請參閱匯出資料表資料一文。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁