從 Cloud Storage 載入 JSON 資料

從 Cloud Storage 載入 JSON 檔案

從 Cloud Storage 載入以換行符號分隔的 JSON 資料時,您可以在新的資料表或分區中載入資料、將資料附加到現有資料表或分區,或覆寫現有資料表或分區。將資料載入至 BigQuery 時,資料會轉換為 Capacitor 列表型格式 (BigQuery 的儲存格式)。

將資料從 Cloud Storage 載入至 BigQuery 資料表時,包含該資料表的資料集必須與 Cloud Storage 值區位於相同的區域或多區域位置。

如要進一步瞭解如何載入本機檔案中的 JSON 資料,請參閱在 BigQuery 中載入本機資料來源中的資料一文。

限制

將 JSON 資料從 Cloud Storage 載入至 BigQuery 時,請注意以下幾點:

  • JSON 資料必須以換行符號分隔。在檔案中各 JSON 物件必須獨立成行。
  • 如果您使用 gzip 壓縮,BigQuery 無法同時讀取資料。在 BigQuery 中,載入已壓縮 JSON 資料的速度比載入未壓縮資料的速度慢。
  • BigQuery 不支援 JSON 對應或字典。例如,"product_categories": {"my_product": 40.0} 無效,但 "product_categories": {"column1": "my_product" , "column2": 40.0} 有效。
  • 載入 CSV 或 JSON 資料時,DATE 資料欄中的值必須使用連字號 (-) 分隔符,且必須採用下列日期格式:YYYY-MM-DD (年-月-日)。
  • 載入 JSON 或 CSV 資料時,TIMESTAMP 欄中的值必須使用連字號 (-) 分隔符來區隔時間戳記的日期部分,且必須採用下列日期格式:YYYY-MM-DD (年-月-日)。時間戳記的 hh:mm:ss (時-分-秒) 部分必須使用冒號 (:) 分隔符。

所需權限

如果您要將資料載入至 BigQuery,您必須擁有專案或資料集層級的權限,才能將資料載入至新的或現有的 BigQuery 資料表與分區。如果是從 Cloud Storage 載入檔案,您還需要擁有包含您的資料的值區存取權。

BigQuery 權限

如果您要將資料從 Cloud Storage 載入至 BigQuery,您必須獲得專案層級或資料集層級的 bigquery.dataOwnerbigquery.dataEditor 角色授權。這兩種角色授予使用者與群組將資料載入至新資料表或將資料附加至現有資料表或覆寫現有資料表的權限。

授予專案層級的角色可讓使用者或群組有權將資料載入至專案中任何資料集的資料表。授予資料集層級的角色可讓使用者或群組只能將資料載入至該資料集的資料表。

如需設定資料集存取權的詳細資訊,請參閱控管資料集存取權。如要進一步瞭解 BigQuery 中的身分與存取權管理 (IAM) 角色,請參閱存取權控管

Cloud Storage 權限

若要從 Cloud Storage 值區載入資料,您必須被授予專案層級的 storage.objects.get 授權或該個別值區的授權。如要使用 URI 萬用字元,您也必須具備 storage.objects.list 權限。

授予預先定義的身分與存取權管理角色 storage.objectViewer,即可提供 storage.objects.getstorage.objects.list 權限。

將 JSON 資料載入資料表

將以換行符號分隔的 JSON 資料從 Cloud Storage 載入新的 BigQuery 表格,或將資料附加至現有資料表中:

主控台

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

  2. 在導覽面板的「Resources」(資源) 區段,展開您的專案並選取資料集。

  3. 在視窗右側的詳細資料面板中,按一下 [Create table] (建立資料表)。載入資料的程序與建立空白資料表的程序相同。

    建立資料表

  4. 在「Create table」(建立資料表) 頁面的「Source」(來源) 區段中:

    • 在「Create table from」(使用下列資料建立資料表) 區段,選取您要採用的來源類型。

      建立資料表來源

    • 在「Source」(來源) 欄位中,瀏覽檔案/Cloud Storage 值區,或輸入 Cloud Storage URI。請注意,您無法在 BigQuery 網頁版 UI 中輸入多個 URI,但可以使用萬用字元。Cloud Storage 值區的位置必須與要建立的表格所在的資料集位置相同。

      選取檔案

    • 針對「File format」(檔案格式) 選取 [JSON]

  5. 在「Create table」(建立資料表) 頁面的「Destination」(目的地) 區段中:

    • 在「Dataset name」(資料集名稱) 部分選擇適當的資料集。

      選取資料集

    • 在「Table name」(資料表名稱) 欄位中,輸入您在 BigQuery 中建立資料表時使用的名稱。

    • 確認「Table type」(資料表類型) 設為「Native table」(原生資料表)

  6. 在「Schema」(結構定義) 區段中,輸入結構定義

    • 透過以下方式,手動輸入結構定義資訊:

      • 啟用 [Edit as text] (以文字形式編輯),然後以 JSON 陣列的形式輸入資料表結構定義:

      • 使用 [Add Field] (新增欄位) 手動輸入結構定義。

  7. 在「Advanced options」(進階選項) 區段中選取適合的項目,然後按一下 [Create table] (建立資料表)。如要瞭解可用的選項,請參閱 JSON 選項一節。

傳統版 UI

  1. 前往 BigQuery 網頁版 UI。
    前往 BigQuery 網頁版 UI

  2. 在導覽面板中,將滑鼠游標懸停在資料集上,然後依序點選向下箭號圖示 向下箭號圖示圖片 > [Create new table] (建立新資料表)。載入資料的程序與建立空白資料表的程序相同。

  3. 在「Create Table」頁面的「Source Data」區段中:

    • 在「Location」(位置) 中,選取 [Cloud Storage],然後在「Source」(來源) 欄位輸入 Cloud Storage URI。請注意,您無法在 BigQuery 網頁版 UI 輸入多個 URI,但可以使用萬用字元。Cloud Storage 值區的位置必須與要建立的資料表所在的資料集位置相同。
    • 針對「File format」選取 [JSON (Newline Delimited)]
  4. 在「Create Table」頁面的「Destination Table」區段中:

    • 在「Table name」(表格名稱) 部分選擇適當的資料集,然後在表格名稱欄位中,輸入要在 BigQuery 中建立的表格名稱。
    • 確認「Table type」(資料表類型) 設為「Native table」(原生資料表)
  5. 在「Schema」(結構定義) 區段中,輸入結構定義。

    • 透過以下方式,手動輸入結構定義資訊:

      • 按一下 [Edit as text] (以文字形式編輯),然後以 JSON 陣列的形式輸入資料表結構定義:

        以 JSON 陣列的形式新增結構定義

      • 使用 [Add Field] 手動輸入結構定義:

        使用新增欄位新增結構定義

  6. 在「Options」區段中選取適合的項目,然後按一下 [Create Table]。如要瞭解可用的選項,請參閱 JSON 選項一節。

指令列

使用 bq load 指令,將 NEWLINE_DELIMITED_JSON 指定為 source_format,並加入 Cloud Storage URI。您可以加入單一 URI、逗號分隔的 URI 清單,或包含萬用字元的 URI。

提供 --location 標記,並將值設為您的位置

bq --location=[LOCATION] load --source_format=[FORMAT] [DATASET].[TABLE] [PATH_TO_SOURCE] [SCHEMA]

其中:

  • [LOCATION] 是您的位置。--location 是選用標記。例如,如果您在東京地區使用 BigQuery,請將標記的值設為 asia-northeast1。您可以使用 .bigqueryrc 檔案設定位置的預設值。
  • [FORMAT] 是 NEWLINE_DELIMITED_JSON。
  • [DATASET] 是現有資料集。
  • [TABLE] 是您正在載入資料的資料表名稱。
  • [PATH_TO_SOURCE] 是完全合格的 Cloud Storage URI 或逗號分隔的 URI 清單。您也可以使用萬用字元
  • [SCHEMA] 是有效的結構定義。結構定義可以是本機 JSON 檔案,或可內嵌為指令的一部分。您也可以改用 --autodetect 標記,而不提供結構定義。

除此之外,您也可以新增 JSON 選項的標記,藉此控制 BigQuery 剖析資料的方式。

範例:

  • 下列指令會將 gs://mybucket/mydata.json 中的資料載入至 mydataset 中名為 mytable 的資料表。結構定義是透過名為 myschema.json 的本機結構定義檔案定義。mybucketmydataset 是在 US 多區域位置中建立的。

    bq --location=US load --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata.json ./myschema.json
    
  • 下列指令會將 gs://mybucket/mydata.json 中的資料載入至 mydataset 中名為 mytable 的資料表。結構定義是以內嵌的方式定義,格式為 [FIELD]:[DATA_TYPE], [FIELD]:[DATA_TYPE]mybucketmydataset 是在 US 多區域位置中建立的。

    bq --location=US load --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata.json qtr:STRING,sales:FLOAT,year:STRING
    

    注意:在指令列中指定結構定義時,您無法加入 RECORD (STRUCT) 類型和欄位說明,也不能指定欄位模式。所有欄位模式均預設為 NULLABLE。如要加入欄位說明、模式和 RECORD 類型,請提供 JSON 結構定義檔案

API

設定下列屬性,以使用 API 載入以換行符號分隔的 JSON 資料。

  1. 建立指向 Cloud Storage 中來源資料的載入工作

  2. 工作資源jobReference 區段中,於 location 屬性指定您的位置

  3. 來源 URI 必須完整且符合下列格式:gs://[BUCKET]/[OBJECT]。每個 URI 可包含一個「*」萬用字元

  4. configuration.load.sourceFormat 屬性設為 NEWLINE_DELIMITED_JSON 以指定資料格式。

  5. 如要檢查工作狀態,請呼叫 jobs.get([JOB_ID]*),其中 [JOB_ID] 是初始要求傳回的工作 ID。

    • 出現 status.state = DONE,表示工作順利完成。
    • 出現 status.errorResult 屬性表示要求失敗,且該物件會包含描述問題的資訊。要求若失敗,則不會建立任何資料表,也不會新增任何資料。
    • 未出現 status.errorResult 表示工作成功完成,但可能有一些不嚴重的錯誤,例如匯入一些資料列時發生問題。不嚴重的錯誤會列在傳回的工作物件的 status.errors 屬性中。

API 附註:

  • 載入工作是整體一致的,如果載入工作失敗,則所有資料都無法使用;如果載入工作成功,則所有資料都可以使用。

  • 最佳做法是產生一個唯一識別碼,並在呼叫 jobs.insert() 建立載入工作時,將這個識別碼當做 jobReference.jobId 傳送。此方法較不受網路故障問題的影響,因為用戶端可對已知的工作 ID 進行輪詢或重試。

  • 對指定的工作 ID 呼叫 jobs.insert() 是一種冪等運算;換句話說,您可以對同一個工作 ID 重試無數次,最多將有一個作業成功。

C#

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 C# 設定說明進行操作。詳情請參閱 BigQuery C# API 參考說明文件

請使用 BigQueryClient..CreateLoadJob() 方法,從 Cloud Storage 啟動載入工作。如要使用以換行符號分隔的 JSON,請建立 CreateLoadJobOptions 物件,並將 SourceFormat 屬性設為 FileFormat.NewlineDelimitedJson

using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryLoadTableGcsJson
{
    public void LoadTableGcsJson(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        var gcsURI = "gs://cloud-samples-data/bigquery/us-states/us-states.json";
        var dataset = client.GetDataset(datasetId);
        var schema = new TableSchemaBuilder {
            { "name", BigQueryDbType.String },
            { "post_abbr", BigQueryDbType.String }
        }.Build();
        TableReference destinationTableRef = dataset.GetTableReference(
            tableId: "us_states");
        // Create job configuration
        var jobOptions = new CreateLoadJobOptions()
        {
            SourceFormat = FileFormat.NewlineDelimitedJson
        };
        // Create and run job
        BigQueryJob loadJob = client.CreateLoadJob(
            sourceUri: gcsURI, destination: destinationTableRef,
            schema: schema, options: jobOptions);
        loadJob.PollUntilCompleted();  // Waits for the job to complete.
        // Display the number of rows uploaded
        BigQueryTable table = client.GetTable(destinationTableRef);
        Console.WriteLine(
            $"Loaded {table.Resource.NumRows} rows to {table.FullyQualifiedId}");
    }
}

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")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.json")
gcsRef.SourceFormat = bigquery.JSON
gcsRef.Schema = bigquery.Schema{
	{Name: "name", Type: bigquery.StringFieldType},
	{Name: "post_abbr", Type: bigquery.StringFieldType},
}
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteEmpty

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Java

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Java 設定說明進行操作。詳情請參閱 BigQuery Java API 參考說明文件

使用 LoadJobConfiguration.builder(tableId, sourceUri) 方法,從 Cloud Storage 啟動載入工作。如要使用換行符號分隔的 JSON,請使用 LoadJobConfiguration.setFormatOptions(FormatOptions.json())

String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.json";
TableId tableId = TableId.of(datasetName, tableName);
// Table field definition
Field[] fields =
    new Field[] {
      Field.of("name", LegacySQLTypeName.STRING),
      Field.of("post_abbr", LegacySQLTypeName.STRING)
    };
// Table schema definition
Schema schema = Schema.of(fields);
LoadJobConfiguration configuration =
    LoadJobConfiguration.builder(tableId, sourceUri)
        .setFormatOptions(FormatOptions.json())
        .setCreateDisposition(CreateDisposition.CREATE_IF_NEEDED)
        .setSchema(schema)
        .build();
// Load the table
Job loadJob = bigquery.create(JobInfo.of(configuration));
loadJob = loadJob.waitFor();
// Check the table
System.out.println("State: " + loadJob.getStatus().getState());
return ((StandardTableDefinition) bigquery.getTable(tableId).getDefinition()).getNumRows();

Node.js

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Node.js 設定說明進行操作。詳情請參閱 BigQuery Node.js API 參考說明文件

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

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

/**
 * This sample loads the json file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.json
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.json';

async function loadJSONFromGCS() {
  // Imports a GCS file into a table with manually defined schema.

  // Instantiate clients
  const bigqueryClient = new BigQuery();
  const storageClient = new Storage();

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
  const metadata = {
    sourceFormat: 'NEWLINE_DELIMITED_JSON',
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
      ],
    },
    loation: 'US',
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigqueryClient
    .dataset(datasetId)
    .table(tableId)
    .load(storageClient.bucket(bucketName).file(filename), metadata);
  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}
loadJSONFromGCS();

PHP

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 PHP 設定說明進行操作。詳情請參閱 BigQuery PHP API 參考說明文件

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

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

// instantiate the bigquery table service
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table('us_states');

// create the import job
$gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json';
$schema = [
    'fields' => [
        ['name' => 'name', 'type' => 'string'],
        ['name' => 'post_abbr', 'type' => 'string']
    ]
];
$loadConfig = $table->loadFromStorage($gcsUri)->schema($schema)->sourceFormat('NEWLINE_DELIMITED_JSON');
$job = $table->runJob($loadConfig);
// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Data imported successfully' . PHP_EOL);
}

Python

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

使用 Client.load_table_from_uri() 方法,從 Cloud Storage 啟動載入工作。如要使用以換行符號分隔的 JSON,請將 LoadJobConfig.source_format 屬性設為 NEWLINE_DELIMITED_JSON 字串,並將工作設定做為 job_config 引數傳送至 load_table_from_uri() 方法。

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

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField("name", "STRING"),
    bigquery.SchemaField("post_abbr", "STRING"),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.json"

load_job = client.load_table_from_uri(
    uri,
    dataset_ref.table("us_states"),
    location="US",  # Location must match that of the destination dataset.
    job_config=job_config,
)  # API request
print("Starting job {}".format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print("Job finished.")

destination_table = client.get_table(dataset_ref.table("us_states"))
print("Loaded {} rows.".format(destination_table.num_rows))

Ruby

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Ruby 設定說明進行操作。詳情請參閱 BigQuery Ruby API 參考說明文件

使用 Dataset.load_job() 方法,從 Cloud Storage 啟動載入工作。如要使用以換行符號分隔的 JSON,請將 format 參數設為 "json"

require "google/cloud/bigquery"

def load_table_gcs_json dataset_id = "your_dataset_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  gcs_uri  = "gs://cloud-samples-data/bigquery/us-states/us-states.json"
  table_id = "us_states"

  load_job = dataset.load_job table_id, gcs_uri, format: "json" do |schema|
    schema.string "name"
    schema.string "post_abbr"
  end
  puts "Starting job #{load_job.job_id}"

  load_job.wait_until_done!  # Waits for table load to complete.
  puts "Job finished."

  table = dataset.table(table_id)
  puts "Loaded #{table.rows_count} rows to table #{table.id}"
end

透過結構定義自動偵測功能載入 JSON 資料

主控台

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

  2. 在導覽面板的「Resources」(資源) 部分,展開您的專案並選取資料集。

  3. 在視窗右側的詳細資料面板中,按一下 [Create table] (建立資料表)。載入資料的程序與建立空白資料表的程序相同。

    建立資料表

  4. 在「Create table」(建立資料表) 頁面的「Source」(來源) 區段中:

    • 在「Create table from」(使用下列資料建立資料表) 部分,選取您要採用的來源類型。

      建立資料表來源

    • 在「Source」(來源) 欄位中,瀏覽檔案/Cloud Storage 值區,或輸入 Cloud Storage URI。請注意,您無法在 BigQuery 網頁版 UI 中輸入多個 URI,但可以使用萬用字元。Cloud Storage 值區的位置必須與要建立的表格所在的資料集位置相同。

      選取檔案

    • 針對「File format」(檔案格式) 選取 [JSON]

  5. 在「Create table」(建立資料表) 頁面的「Destination」(目的地) 區段中:

    • 在「Dataset name」(資料集名稱) 部分選擇適當的資料集。

      選取資料集

    • 在「Table name」(資料表名稱) 欄位中,輸入您在 BigQuery 中建立資料表時使用的名稱。

    • 確認「Table type」(資料表類型) 設為「Native table」(原生資料表)

  6. 在「Schema」(結構定義) 區段的「Auto-detect」(自動偵測) 底下,勾選 [Schema and input parameters] (結構定義和輸入參數) 核取方塊,以啟用結構定義自動偵測功能。

    自動偵測連結

  7. 在「Advanced options」(進階選項) 區段中選取適合的項目,然後按一下 [Create table] (建立資料表)。如要瞭解可用的選項,請參閱 JSON 選項一節。

傳統版 UI

  1. 前往 BigQuery 網頁版 UI。
    前往 BigQuery 網頁版 UI

  2. 在導覽面板中,將滑鼠游標懸停在資料集上,然後依序點選向下箭號圖示 向下箭號圖示圖片 > [Create new table] (建立新資料表)。載入資料的程序與建立空白資料表的程序相同。

  3. 在「Create Table」頁面的「Source Data」區段中:

    • 在「Location」(位置) 中,選取 [Cloud Storage],然後在「Source」(來源) 欄位輸入 Cloud Storage URI。請注意,您無法在 BigQuery 網頁版 UI 輸入多個 URI,但可以使用萬用字元。Cloud Storage 值區的位置必須與要建立的資料表所在的資料集位置相同。
    • 針對「File format」選取 [JSON (Newline Delimited)]
  4. 在「Create Table」頁面的「Destination Table」區段中:

    • 在「Table name」(表格名稱) 部分選擇適當的資料集,然後在表格名稱欄位中,輸入要在 BigQuery 中建立的表格名稱。
    • 確認「Table type」(資料表類型) 設為「Native table」(原生資料表)
  5. 在「Schema」(結構定義) 區段中,勾選 [Auto-detect] (自動偵測) 選項以啟用結構定義自動偵測功能。

    自動偵測連結

  6. 在「Options」區段中選取適合的項目,然後按一下 [Create Table]。如要瞭解可用的選項,請參閱 JSON 選項一節。

指令列

使用 bq load 指令,將 NEWLINE_DELIMITED_JSON 指定為 source_format,並加入 Cloud Storage URI。您可以加入單一 URI、逗號分隔的 URI 清單,或包含萬用字元的 URI。

提供 --location 標記,並將值設為您的位置

bq --location=[LOCATION] load --autodetect --source_format=[FORMAT] [DATASET].[TABLE] [PATH_TO_SOURCE]

其中:

  • [LOCATION] 是您的位置。--location 是選用標記。例如,如果您在東京地區使用 BigQuery,請將標記的值設為 asia-northeast1。您可以使用 .bigqueryrc 檔案設定位置的預設值。
  • --autodetect 標記啟用結構定義自動偵測。
  • [FORMAT] 是 NEWLINE_DELIMITED_JSON。
  • [DATASET] 是現有資料集。
  • [TABLE] 是您正在載入資料的資料表名稱。
  • [PATH_TO_SOURCE] 是完全合格的 Cloud Storage URI 或逗號分隔的 URI 清單。您也可以使用萬用字元

除此之外,您也可以新增 JSON 選項的標記,藉此控制 BigQuery 剖析資料的方式。

範例:

  • 下列指令會將 gs://mybucket/mydata.json 中的資料載入至 mydataset 中名為 mytable 的資料表。結構定義是透過結構定義自動偵測功能定義。 mybucketmydataset 建立於 US 多區域位置。

    bq --location=US load --autodetect --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata.json
    
  • 下列指令會將 gs://mybucket/ 中多個檔案的資料載入至 mydataset 中名為 mytable 的資料表。Cloud Storage URI 使用萬用字元,結構定義是使用結構定義自動偵測定義的。 mybucketmydataset 建立於 asia-northeast1 區域。

    bq --location=asia-northeast1 load --autodetect --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata*.json
    
  • 下列指令會將 gs://mybucket/ 中多個檔案的資料載入至 mydataset 中名為 mytable 的資料表。指令包含逗號分隔的 Cloud Storage URI 清單,結構定義是使用結構定義自動偵測定義的。 mybucketmydataset 是在 asia-northeast1 區域中建立的。

    bq --location=asia-northeast1 load --autodetect --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable "gs://mybucket/myfile.json,gs://mybucket/myfile2.json"
    

API

設定下列屬性,以使用 API 載入以換行符號分隔的 JSON 資料。

  1. 建立指向 Cloud Storage 中來源資料的載入工作

  2. 工作資源jobReference 區段中,於 location 屬性指定您的位置

  3. 來源 URI 必須完整且符合下列格式:gs://[BUCKET]/[OBJECT]。每個 URI 可包含一個「*」萬用字元

  4. configuration.load.sourceFormat 屬性設為 NEWLINE_DELIMITED_JSON 以指定資料格式。

  5. 如要檢查工作狀態,請呼叫 jobs.get([JOB_ID]*),其中 [JOB_ID] 是初始要求傳回的工作 ID。

    • 出現 status.state = DONE,表示工作順利完成。
    • 出現 status.errorResult 屬性表示要求失敗,且該物件會包含描述問題的資訊。要求若失敗,則不會建立任何資料表,也不會新增任何資料。
    • 未出現 status.errorResult 表示工作成功完成,但可能有一些不嚴重的錯誤,例如匯入一些資料列時發生問題。不嚴重的錯誤會列在傳回的工作物件的 status.errors 屬性中。

API 附註:

  • 載入工作是整體一致的,如果載入工作失敗,則所有資料都無法使用;如果載入工作成功,則所有資料都可以使用。

  • 最佳做法是產生一個唯一識別碼,並在呼叫 jobs.insert() 建立載入工作時,將這個識別碼當做 jobReference.jobId 傳送。此方法較不受網路故障問題的影響,因為用戶端可對已知的工作 ID 進行輪詢或重試。

  • 對指定的工作 ID 呼叫 jobs.insert() 是一種冪等運算;換句話說,您可以對同一個工作 ID 重試無數次,最多會有一個作業成功。

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")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.json")
gcsRef.SourceFormat = bigquery.JSON
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteEmpty

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Node.js

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Node.js 設定說明進行操作。詳情請參閱 BigQuery Node.js API 參考說明文件

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

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

/**
 * This sample loads the JSON file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.json
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.json';

async function loadJSONFromGCSAutodetect() {
  // Imports a GCS file into a table with autodetected schema.

  // Instantiate clients
  const bigqueryClient = new BigQuery();
  const storageClient = new Storage();

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
  const metadata = {
    sourceFormat: 'NEWLINE_DELIMITED_JSON',
    autodetect: true,
    location: 'US',
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigqueryClient
    .dataset(datasetId)
    .table(tableId)
    .load(storageClient.bucket(bucketName).file(filename), metadata);
  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}
loadJSONFromGCSAutodetect();

PHP

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 PHP 設定說明進行操作。詳情請參閱 BigQuery PHP API 參考說明文件

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

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

// instantiate the bigquery table service
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table('us_states');

// create the import job
$gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json';
$loadConfig = $table->loadFromStorage($gcsUri)->autodetect(true)->sourceFormat('NEWLINE_DELIMITED_JSON');
$job = $table->runJob($loadConfig);
// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Data imported successfully' . PHP_EOL);
}

Python

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

如要啟用結構定義自動偵測功能,請將 LoadJobConfig.autodetect property 屬性設為 True

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

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.autodetect = True
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.json"
load_job = client.load_table_from_uri(
    uri, dataset_ref.table("us_states"), job_config=job_config
)  # API request
print("Starting job {}".format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print("Job finished.")

destination_table = client.get_table(dataset_ref.table("us_states"))
print("Loaded {} rows.".format(destination_table.num_rows))

Ruby

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Ruby 設定說明進行操作。詳情請參閱 BigQuery Ruby API 參考說明文件

require "google/cloud/bigquery"

def load_table_gcs_json_autodetect dataset_id = "your_dataset_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  gcs_uri  = "gs://cloud-samples-data/bigquery/us-states/us-states.json"
  table_id = "us_states"

  load_job = dataset.load_job table_id,
                              gcs_uri,
                              format:     "json",
                              autodetect: true
  puts "Starting job #{load_job.job_id}"

  load_job.wait_until_done!  # Waits for table load to complete.
  puts "Job finished."

  table = dataset.table(table_id)
  puts "Loaded #{table.rows_count} rows to table #{table.id}"
end

載入巢狀和重複的 JSON 資料

BigQuery 可從支援物件型結構定義的來源格式 (例如 JSON、Avro 和 Cloud Datastore) 載入巢狀與重複的資料。

每一行中都必須有一個 JSON 物件 (包括任何巢狀/重複欄位)。

範例

以下是巢狀/重複資料的範例。這個資料表含有人員相關資訊,組成欄位如下:

  • id
  • first_name
  • last_name
  • dob (生日)
  • addresses (巢狀與重複欄位)
    • addresses.status (目前或之前)
    • addresses.address
    • addresses.city
    • addresses.state
    • addresses.zip
    • addresses.numberOfYears (在此地址居住的年數)

JSON 資料欄位如下所示。請注意,地址欄位含有值陣列 (以 [ ] 表示)。

{"id":"1","first_name":"John","last_name":"Doe","dob":"1968-01-22","addresses":[{"status":"current","address":"123 First Avenue","city":"Seattle","state":"WA","zip":"11111","numberOfYears":"1"},{"status":"previous","address":"456 Main Street","city":"Portland","state":"OR","zip":"22222","numberOfYears":"5"}]}
{"id":"2","first_name":"Jane","last_name":"Doe","dob":"1980-10-16","addresses":[{"status":"current","address":"789 Any Avenue","city":"New York","state":"NY","zip":"33333","numberOfYears":"2"},{"status":"previous","address":"321 Main Street","city":"Hoboken","state":"NJ","zip":"44444","numberOfYears":"3"}]}

此資料表的結構定義如下所示:

[
    {
        "name": "id",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "first_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "last_name",
        "type": "STRING",
        "mode": "NULLABLE"
    },
    {
        "name": "dob",
        "type": "DATE",
        "mode": "NULLABLE"
    },
    {
        "name": "addresses",
        "type": "RECORD",
        "mode": "REPEATED",
        "fields": [
            {
                "name": "status",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "address",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "city",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "state",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "zip",
                "type": "STRING",
                "mode": "NULLABLE"
            },
            {
                "name": "numberOfYears",
                "type": "STRING",
                "mode": "NULLABLE"
            }
        ]
    }
]

要瞭解如何指定巢狀和重複結構定義,請參閱指定巢狀和重複的欄位相關文章。

使用 JSON 資料覆寫資料表

如要在資料表中載入額外資料,您可以指定來源檔案或附加查詢結果。如果資料的結構定義與目標資料表或分區的結構定義不符,您可以在附加或覆寫時更新目標資料表或分區的結構定義。

如果您在附加資料時更新結構定義,BigQuery 可讓您:

  • 新增欄位
  • REQUIRED 欄位放寬為 NULLABLE

如果是覆寫資料表,系統一律會覆寫結構定義。覆寫表格時,結構定義更新不受限制。

在主控台或傳統版 BigQuery 網頁版 UI 中,使用 [Write preference] (寫入偏好設定) 選項來指定從來源檔案或從查詢結果載入資料時採取的動作。CLI 與 API 提供下列選項:

主控台選項 傳統版 UI 選項 CLI 標記 BigQuery API 屬性 說明
空白時寫入 空白時寫入 WRITE_EMPTY 資料表空白時才會寫入資料。
附加到表格中 附加到表格中 --noreplace--replace=false;如果未指定 --[no]replace,預設動作為附加 WRITE_APPEND (預設值) 將資料附加至資料表尾端。
覆寫資料表 覆寫資料表 --replace--replace=true WRITE_TRUNCATE 清除資料表中所有現有的資料後再寫入新資料。

根據預設,除非更改寫入配置方式,否則載入工作會將資料附加至資料表。如果您想將資料換成載入工作中的資料,可以選擇覆寫 BigQuery 表格中的資料:

主控台

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

  2. 在導覽面板的「Resources」(資源) 部分,展開您的專案並選取資料集。

  3. 在視窗右側的詳細資料面板中,按一下 [Create table] (建立資料表)。載入資料的程序與建立空白資料表的程序相同。

    建立資料表

  4. 在「Create table」(建立資料表) 頁面的「Source」(來源) 區段中:

    • 在「Create table from」(使用下列資料建立資料表) 部分,選取您要採用的來源類型。

      建立資料表來源

    • 在「Source」(來源) 欄位中,瀏覽檔案/Cloud Storage 值區,或輸入 Cloud Storage URI。請注意,您無法在 BigQuery 網頁版 UI 中輸入多個 URI,但可以使用萬用字元。Cloud Storage 值區的位置必須與要建立的表格所在的資料集位置相同。

      查看資料集

    • 針對「File format」(檔案格式) 選取 [JSON]

  5. 在「Create table」(建立資料表) 頁面的「Destination」(目的地) 區段中:

    • 在「Dataset name」(資料集名稱) 部分選擇適當的資料集。

      選取資料集

    • 在「Table name」(資料表名稱) 欄位中,輸入您在 BigQuery 中建立資料表時使用的名稱。

    • 確認「Table type」(資料表類型) 設為「Native table」(原生資料表)

  6. 在「Schema」(結構定義) 區段中,輸入結構定義

    • 透過以下方式,手動輸入結構定義資訊:

      • 啟用 [Edit as text] (以文字形式編輯),然後以 JSON 陣列的形式輸入資料表結構定義:

      • 使用 [Add Field] (新增欄位) 手動輸入結構定義。

  7. 在「Advance options」(進階選項) 部分的「Write preference」(寫入偏好設定),選擇 [Write if empty] (空白時寫入)、[Append to table] (附加到表格中) 或是 [Overwrite table] (覆寫資料表)

    覆寫表格

  8. 按一下 [Create table] (建立資料表)

    1. 按一下 [Create table] (建立資料表)

傳統版 UI

  1. 前往 BigQuery 網頁版 UI。
    前往 BigQuery 網頁版 UI

  2. 在導覽面板中,將滑鼠游標懸停在資料集上,然後依序點選向下箭號圖示 向下箭號圖示圖片 > [Create new table] (建立新資料表)。載入資料的程序與建立空白資料表的程序相同。

  3. 在「Create Table」頁面的「Source Data」區段中:

    • 在「Location」(位置) 中,選取 [Cloud Storage],然後在「Source」(來源) 欄位輸入 Cloud Storage URI。請注意,您無法在 UI 輸入多個 URI,但可以使用萬用字元。Cloud Storage 值區的位置必須與您要附加或覆寫的資料表所在的資料集位置相同。
    • 針對「File format」選取 [JSON (Newline Delimited)]
  4. 在「Create Table」頁面的「Destination Table」區段中:

    • 在「Table name」(表格名稱) 部分選擇適當的資料集,然後在表格名稱欄位中輸入要附加或覆寫的表格名稱。
    • 確認「Table type」(資料表類型) 設為「Native table」(原生資料表)
  5. 在「Schema」(結構定義) 區段中,輸入結構定義。如要更新結構定義,您可以新增欄位或將欄位從 REQUIRED 變更 (放寬) 為 NULLABLE

    • 如為 JSON 檔案,您可以勾選 [Auto-detect] (自動偵測) 選項來啟用結構定義自動偵測功能。

      自動偵測連結

    • 您也可以使用下列任一種方式,手動輸入結構定義資訊:

      • 按一下 [Edit as text] (以文字形式編輯),然後以 JSON 陣列的形式輸入資料表結構定義:

        以 JSON 陣列的形式新增結構定義

      • 使用 [Add Field] 手動輸入結構定義:

        使用新增欄位新增結構定義

  6. 在「Options」區段的「Write preference」中,選擇 [Write if empty]、[Append to table] 或 [Overwrite table]

    使用新增欄位新增結構定義

  7. 按一下 [Create Table] (建立資料表)

指令列

輸入帶有 --replace 標記的 bq load 指令以覆寫資料表。提供 --location 標記,並將值設為您的位置。使用 --noreplace 標記將資料附加至資料表。未指定任何標記時,預設值為附加資料。

附加或覆寫資料表時,您可以使用 --schema_update_option 標記來將目標資料表的結構定義更新為新資料的結構定義。下列選項可搭配 --schema_update_option 標記使用:

  • ALLOW_FIELD_ADDITION:新增欄位至結構定義;新欄位不得為 REQUIRED
  • ALLOW_FIELD_RELAXATION:將必填欄位放寬為可以為空值;重複此選項可指定值清單
bq --location=[LOCATION] load --[no]replace [DATASET].[TABLE] [PATH_TO_SOURCE] [SCHEMA]

其中:

  • [LOCATION] 是您的位置--location 是選用標記。您可以使用 .bigqueryrc 檔案設定位置的預設值。
  • [DATASET] 是現有資料集。
  • [TABLE] 是您正在載入資料的資料表名稱。
  • [PATH_TO_SOURCE] 是完全合格的 Cloud Storage URI 或逗號分隔的 URI 清單。您也可以使用萬用字元
  • [SCHEMA] 是有效的結構定義。結構定義可以是本機 JSON 檔案,或可內嵌為指令的一部分。您也可以改用 --autodetect 標記,而不提供結構定義。

除此之外,您也可以新增 JSON 選項的標記,藉此控制 BigQuery 剖析資料的方式。

範例:

  • 下列指令會載入 gs://mybucket/mydata.json 中的資料,並覆寫 mydataset 中名為 mytable 的資料表。系統將透過結構定義自動偵測功能來指定結構定義。mybucketmydataset 均建立於 US 多地區位置。

    bq --location=US load --autodetect --replace --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata.json
    
  • 下列指令會載入 gs://mybucket/mydata.json 中的資料,並將資料附加至 mydataset 中名為 mytable 的資料表。結構定義是透過 JSON 結構定義檔案 myschema.json 定義。mybucketmydataset 是在 US 多區域位置中建立的。

    bq --location=US load --autodetect --noreplace --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata.json ./myschema.json
    
  • 下列指令會載入 gs://mybucket/mydata.json 中的資料,並將資料附加至 mydataset 中名為 mytable 的資料表。此指令使用了名為 myschema.json 的本機 JSON 結構定義檔案。結構定義包含目標資料表中沒有的新欄位。mybucketmydataset 建立於 asia-northeast1 區域。

    bq --location=asia-northeast1 load --noreplace --schema_update_option=ALLOW_FIELD_ADDITION --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata.json ./myschema.json
    
  • 下列指令會載入 gs://mybucket/mydata.csv 中的資料,並將資料附加至 mydataset 中名為 mytable 的資料表。使用了名為 myschema.json 的本機 JSON 結構定義檔案。結構定義將兩個REQUIRED欄位變更 (放寬) 為NULLABLEmybucketmydataset 建立於 asia-northeast1 區域。

    bq --location=asia-northeast1 load --noreplace --schema_update_option=ALLOW_FIELD_RELAXATION --source_format=NEWLINE_DELIMITED_JSON mydataset.mytable gs://mybucket/mydata.json ./myschema.json
    

API

設定下列屬性,以使用 API 載入 JSON 資料。

  1. 建立指向 Cloud Storage 中來源資料的載入工作

  2. 工作資源jobReference 區段中,於 location 屬性指定您的位置

  3. 來源 URI 必須完整且符合下列格式:gs://[BUCKET]/[OBJECT]。您可以使用逗號分隔清單的形式包含多個 URI。請注意,從 Cloud Storage 載入 CSV 資料時,也可以使用萬用字元

  4. configuration.load.sourceFormat 屬性設為 NEWLINE_DELIMITED_JSON 以指定資料格式。

  5. configuration.load.writeDisposition 屬性設為 WRITE_TRUNCATEWRITE_APPENDWRITE_EMPTY,以指定寫入偏好設定。

  6. 如要在載入工作中更新結構定義,請將 configuration.load.schemaUpdateOptions 屬性設為 ALLOW_FIELD_ADDITIONALLOW_FIELD_RELAXATION

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")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.json")
gcsRef.SourceFormat = bigquery.JSON
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteTruncate

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("job completed with error: %v", status.Err())
}

Node.js

在試用這個範例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Node.js 設定說明進行操作。詳情請參閱 BigQuery Node.js API 參考說明文件

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

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

/**
 * This sample loads the JSON file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.json
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.json';

async function loadJSONFromGCSTruncate() {
  /**
   * Imports a GCS file into a table and overwrites
   * table data if table already exists.
   */

  // Instantiate clients
  const bigqueryClient = new BigQuery();
  const storageClient = new Storage();

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
  const metadata = {
    sourceFormat: 'NEWLINE_DELIMITED_JSON',
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
      ],
    },
    // Set the write disposition to overwrite existing table data.
    writeDisposition: 'WRITE_TRUNCATE',
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigqueryClient
    .dataset(datasetId)
    .table(tableId)
    .load(storageClient.bucket(bucketName).file(filename), metadata);
  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

PHP

在試行此示例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 PHP 設定說明進行操作。詳情請參閱 BigQuery PHP API 參考說明文件

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

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

// instantiate the bigquery table service
$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$table = $bigQuery->dataset($datasetId)->table($tableId);

// create the import job
$gcsUri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json';
$loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('NEWLINE_DELIMITED_JSON')->writeDisposition('WRITE_TRUNCATE');
$job = $table->runJob($loadConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});

// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Data imported successfully' . PHP_EOL);
}

Python

如要取代現有資料表中的資料列,請將 LoadJobConfig.write_disposition 屬性設為 WRITE_TRUNCATE 字串。

在嘗試這個範例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('existing_table')

job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.json"
load_job = client.load_table_from_uri(
    uri, table_ref, job_config=job_config
)  # API request
print("Starting job {}".format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print("Job finished.")

destination_table = client.get_table(table_ref)
print("Loaded {} rows.".format(destination_table.num_rows))

Ruby

如要取代現有資料表中的資料列,請將 Table.load_job()write 參數設為 "WRITE_TRUNCATE"

在嘗試這個範例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Ruby 設定說明進行操作。詳情請參閱 BigQuery Ruby API 參考說明文件

require "google/cloud/bigquery"

def load_table_gcs_json_truncate(
    dataset_id = "your_dataset_id",
    table_id   = "your_table_id"
  )
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  gcs_uri  = "gs://cloud-samples-data/bigquery/us-states/us-states.json"

  load_job = dataset.load_job table_id,
                              gcs_uri,
                              format: "json",
                              write:  "truncate"
  puts "Starting job #{load_job.job_id}"

  load_job.wait_until_done!  # Waits for table load to complete.
  puts "Job finished."

  table = dataset.table(table_id)
  puts "Loaded #{table.rows_count} rows to table #{table.id}"
end

JSON 選項

如要變更 BigQuery 剖析 JSON 資料的方式,請在主控台、傳統版 UI、CLI 或 API 中指定額外選項。

JSON 選項 主控台選項 傳統版 UI 選項 CLI 標記 BigQuery API 屬性 說明
Number of bad records allowed (允許的損壞紀錄數量) Number of errors allowed (允許的錯誤數量) Number of errors allowed --max_bad_records maxBadRecords (選擇性) BigQuery 在執行工作時可忽略的損壞紀錄數量上限。如果損壞紀錄的實際數量超過這個值,工作結果中就會出現無效錯誤。預設值為 0,表示所有紀錄都必須有效。
Unknown values (不明的值) Ignore unknown values (略過不明的值) Ignore unknown values --ignore_unknown_values ignoreUnknownValues (選擇性) 表示 BigQuery 是否應允許不在資料表結構定義中的其他值。如為 true,會忽略其他值。如為 false,包含其他欄位的紀錄會視為損壞紀錄,如有太多損壞紀錄,工作結果中就會出現無效錯誤。預設值為 false。sourceFormat 屬性決定 BigQuery 將什麼視為其他值:如為 CSV,則是結尾資料欄;如為 JSON,則是不符合任何資料欄名稱的已命名值
本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁