管理資料表中的資料

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

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

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

將資料載入資料表

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

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

瀏覽資料表中的資料

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

  • 使用 Cloud Console 或 BigQuery 傳統網頁版 UI
  • 使用指令列工具的 bq head 指令
  • 呼叫 tabledata.list API 方法
  • 使用用戶端程式庫

所需權限

您至少必須擁有 bigquery.tables.getData 權限,才能瀏覽資料表和分區的資料。以下是具有 bigquery.tables.getData 權限的預先定義 Cloud IAM 角色:

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

此外,當具備 bigquery.datasets.create 權限的使用者建立資料集時,會獲得該資料集的 bigquery.dataOwner 存取權。bigquery.dataOwner 存取權可讓使用者瀏覽資料集內的資料表和分區資料。

如要進一步瞭解 BigQuery 中的 Cloud IAM 角色和權限,請參閱預先定義的角色與權限一文。

瀏覽資料表中的資料

如何瀏覽資料表中的資料:

主控台

  1. 在 Cloud Console 中開啟 BigQuery 網頁版 UI。
    前往 Cloud Console

  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 "columns" \
project_id:dataset.table

其中:

  • integer1 是要顯示的列數。
  • 「integer2」是顯示資料前略過的列數。
  • 「columns」是以逗號分隔的資料欄清單。
  • 「project_id」是您的專案 ID。
  • 「dataset」是包含此資料表的資料集名稱。
  • table 是要瀏覽的資料表名稱。

範例:

輸入下列指令,列出 mydataset.mytable 中前 10 列的所有資料欄。mydataset 在您的預設專案中。

bq head --max_rows=10 mydataset.mytable

輸入下列指令,列出 mydataset.mytable 中前 100 列的所有資料欄。mydatasetmyotherproject 中,而不是您的預設專案中。

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 指令不會建立查詢工作,所以 指令不會出現在您的查詢記錄中,也不會產生費用。

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 and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

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

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

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

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

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 更新或刪除資料,您必須先刪除資料表,然後以新資料重新建立該資料表。另外,您也可以撰寫查詢來修改資料,並將查詢結果寫入新的目標資料表。

複製資料表資料

您可以透過以下方式複製資料表:

  • 使用 Cloud Console 或 BigQuery 傳統網頁版 UI
  • 使用指令列工具的 bq cp 指令
  • 呼叫 API 方法 jobs.insert 並設定複製工作
  • 使用用戶端程式庫

相關詳情請參閱複製資料表一節。

匯出資料表中的資料

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

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

後續步驟

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

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

這個網頁
需要協助嗎?請前往我們的支援網頁