從 Cloud Storage 載入 ORC 資料

本頁面提供將 ORC 資料從 Cloud Storage 載入至 BigQuery 的總覽。

ORC 是 Apache Hadoop 生態系統廣泛使用的開放原始碼欄導向式資料格式。

從 Cloud Storage 載入 ORC 資料時,可將資料載入至新的資料表或分區,或將資料附加到現有資料表或分區,或覆寫現有資料表或分區。將資料載入至 BigQuery 時,資料會轉換為 Capacitor 列表型格式 (BigQuery 的儲存格式)。

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

如需從本機檔案載入 ORC 資料的相關資訊,請參閱 將資料從本機資料來源載入至 BigQuery

ORC 結構定義

將 ORC 檔案載入至 BigQuery 時,會透過自述式來源資料自動擷取資料表結構定義。當 BigQuery 從來源資料擷取結構定義時,會按字母順序使用最後一個檔案。

舉例來說,Cloud Storage 中有下列 ORC 檔案:

gs://mybucket/00/
  a.orc
  z.orc
gs://mybucket/01/
  b.orc

這個指令可透過單一 CLI 指令 (以逗號分隔的清單) 載入所有檔案,並從 mybucket/01/b.orc 擷取結構定義:

bq --location=US load --source_format=ORC [DATASET].[TABLE] "gs://mybucket/00/*.orc","gs://mybucket/01/*.orc"

當 BigQuery 偵測到結構定義時,部分 ORC 資料類型會轉換為 BigQuery 資料類型,確保與 BigQuery SQL 語法相容。在偵測到的結構定義中,所有欄位均為 NULLABLE。詳情請參閱 ORC 轉換

載入具有不同結構定義的多個 ORC 檔案時,多個結構定義中所指定的相同欄位 (具有相同名稱與相同巢狀層級) 必須對應至各個結構定義中相同的已轉換 BigQuery 資料類型。

ORC 壓縮

壓縮的 ORC 檔案未受支援,但壓縮的頁尾和等量區有。支援的壓縮類型有 Zlib、Snappy、LZO 與 LZ4。

將 ORC 資料載入至新的資料表

如要將 ORC 資料從 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」(檔案格式) 選取 [ORC]

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

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

      查看資料集

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

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

  6. 在「Schema」(結構定義) 區段中,無需採取任何行動。結構定義自述於 ORC 檔案中。

  7. 在「Advanced options」(進階選項) 區段中選取適合的項目,然後按一下 [Create table] (建立資料表)

傳統版 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」(檔案格式) 選取 [ORC]
  4. 在「Create Table」(建立資料表) 頁面的「Destination Table」(目標資料表) 部分中:

    • 在「Table name」(表格名稱) 部分選擇適當的資料集,然後在表格名稱欄位中,輸入要在 BigQuery 中建立的表格名稱。
    • 確認「Table type」(資料表類型) 設為 [Native table] (原生資料表)
  5. 在「Schema」(結構定義) 區段中,無需採取任何行動。結構定義自述於 ORC 檔案中。

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

指令列

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

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

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

其中:

  • [LOCATION] 是您的位置。如果您的資料位於 USEU 多地區位置,則 --location 是選用標記。舉例來說,假設您是在東京地區使用 BigQuery,請將標記的值設為 asia-northeast1。您可以使用 .bigqueryrc 檔案來設定位置的預設值。
  • [FORMAT]ORC
  • [DATASET] 是現有資料集。
  • [TABLE] 是您正在載入資料的資料表名稱。
  • [PATH_TO_SOURCE] 是完整的 Cloud Storage URI 或逗號分隔的 URI 清單。您也可以使用萬用字元

範例:

  • 下列指令會將 gs://mybucket/mydata.orc 中的資料載入至 mydataset 中名為 mytable 的資料表。mybucketmydataset 建立於 US 多區域位置。

    bq --location=US load --source_format=ORC mydataset.mytable gs://mybucket/mydata.orc
    
  • 下列指令會將 gs://mybucket/ 中多個檔案的資料載入至 mydataset 中名為 mytable 的資料表。Cloud Storage URI 使用萬用字元。 mybucketmydataset 建立於 US 多地區位置。

    bq --location=US load --source_format=ORC mydataset.mytable gs://mybucket/mydata*.orc
    
  • 下列指令會將 gs://mybucket/ 中多個檔案的資料載入至 mydataset 中名為 mytable 的資料表。指令包含以逗號分隔且帶有萬用字元的 Cloud Storage URI 清單。mybucketmydataset 建立於 asia-northeast1 地區。

    bq --location=asia-northeast1 load --autodetect --source_format=ORC mydataset.mytable "gs://mybucket/00/*.orc","gs://mybucket/01/*.orc"
    

API

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

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

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

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

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

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

    • 出現 status.state = DONE,表示工作順利完成。
    • 出現 status.errorResult 屬性則表示要求失敗,且該物件會包含描述錯誤的資訊。要求若失敗,則不會建立任何資料表,也不會新增任何資料。

    • 未出現 status.errorResult 表示工作成功完成,但可能有一些不嚴重的錯誤,例如匯入一些資料列時發生問題。不嚴重的錯誤會列在傳回的工作物件的 status.errors 屬性中。

API 附註:

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

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

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

C#

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

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

public class BigQueryLoadTableGcsOrc
{
    public void LoadTableGcsOrc(
        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.orc";
        var dataset = client.GetDataset(datasetId);
        TableReference destinationTableRef = dataset.GetTableReference(
            tableId: "us_states");
        // Create job configuration
        var jobOptions = new CreateLoadJobOptions()
        {
            SourceFormat = FileFormat.Orc
        };
        // Create and run job
        var loadJob = client.CreateLoadJob(
            sourceUri: gcsURI,
            destination: destinationTableRef,
            // Pass null as the schema because the schema is inferred when
            // loading Orc data
            schema: null,
            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.orc")
gcsRef.SourceFormat = bigquery.ORC
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)

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 line before running the sample.
 */
// const datasetId = "my_dataset";
// const tableId = "my_table"

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

async function loadTableGCSORC() {
  // Imports a GCS file into a table with ORC source format.

  // 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: 'ORC',
    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;
  }
}
loadTableGCSORC();

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.orc';
$loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('ORC');
$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 參考說明文件

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

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.ORC
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.orc"

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_orc 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.orc"
  table_id = "us_states"

  load_job = dataset.load_job table_id, gcs_uri, format: "orc"
  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

使用 ORC 資料覆寫資料表

如要將額外的資料載入到資料表,您可以指定來源檔案或附加查詢結果。

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

將額外資料載入表格時,可以選擇下列選項:

主控台選項 傳統版 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」(檔案格式) 選取 [ORC]

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

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

      選取資料集

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

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

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

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

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

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

  7. 在「Advanced options」(進階選項) 區段中,針對「Write preference」(寫入偏好設定),選擇 [Write if empty] (空白時寫入)、[Append to table] (附加到資料表中) 或 [Overwrite table] (覆寫資料表)

    覆寫資料表

  8. 按一下 [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」(檔案格式) 選取 [ORC]
  4. 在「Create Table」(建立資料表) 頁面的「Destination Table」(目標資料表) 部分中:

    • 在「Table name」(表格名稱) 部分選擇適當的資料集,然後在表格名稱欄位中輸入要附加或覆寫的表格名稱。
    • 確認「Table type」(資料表類型) 設為 [Native table] (原生資料表)
  5. 在「Schema」(結構定義) 區段中,無需採取任何行動。結構定義資訊自述於 ORC 檔案中。

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

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

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

指令列

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

bq --location=[LOCATION] load --[no]replace [DATASET].[TABLE] [PATH_TO_SOURCE]

其中:

  • [LOCATION] 是您的位置。 如果您的資料位於 USEU 多地區位置,則 --location 是選用標記。您可以使用 .bigqueryrc 檔案設定位置的預設值。
  • [DATASET] 是現有資料集。
  • [TABLE] 是您正在載入資料的資料表名稱。
  • [PATH_TO_SOURCE] 是完整的 Cloud Storage URI 或逗號分隔的 URI 清單。您也可以使用萬用字元

範例:

  • 下列指令會從 gs://mybucket/mydata.orc 載入資料並覆寫在 mydataset 中名為 mytable 的資料表。mybucketmydataset 建立於 US 多區域位置。

    bq --location=US load --replace --source_format=ORC mydataset.mytable gs://mybucket/mydata.orc
    
  • 下列指令會從 gs://mybucket/mydata.orc 載入資料並將資料附加至 mydataset 中名為 mytable 的資料表。mybucketmydataset 建立於 asia-northeast1 區域。

    bq --location=asia-northeast1 load --noreplace --source_format=ORC mydataset.mytable gs://mybucket/mydata.orc
    

API

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

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

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

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

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

  5. configuration.load.writeDisposition 屬性設為 WRITE_TRUNCATEWRITE_APPENDWRITE_EMPTY,以指定寫入偏好設定。針對載入工作,預設模式為 WRITE_APPEND。

C#

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

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

public class BigQueryLoadTableGcsOrcTruncate
{
    public void LoadTableGcsOrcTruncate(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id",
        string tableId = "your_table_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        var gcsURI = "gs://cloud-samples-data/bigquery/us-states/us-states.orc";
        var dataset = client.GetDataset(datasetId);
        TableReference destinationTableRef = dataset.GetTableReference(
            tableId: "us_states");
        // Create job configuration
        var jobOptions = new CreateLoadJobOptions()
        {
            SourceFormat = FileFormat.Orc,
            WriteDisposition = WriteDisposition.WriteTruncate
        };
        // Create and run job
        var loadJob = client.CreateLoadJob(
            sourceUri: gcsURI,
            destination: destinationTableRef,
            // Pass null as the schema because the schema is inferred when
            // loading Orc data
            schema: null, 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.orc")
gcsRef.SourceFormat = bigquery.ORC
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
// Default for import jobs is to append data to a table.  WriteTruncate
// specifies that existing data should instead be replaced/overwritten.
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 CSV file at
 * https://storage.googleapis.com/cloud-samples-data/bigquery/us-states/us-states.csv
 *
 * TODO(developer): Replace the following lines with the path to your file.
 */
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.orc';

async function loadORCFromGCSTruncate() {
  /**
   * 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: 'ORC',
    // Set the write disposition to overwrite existing table data.
    writeDisposition: 'WRITE_TRUNCATE',
    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;
  }
}
loadORCFromGCSTruncate();

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.orc';
$loadConfig = $table->loadFromStorage($gcsUri)->sourceFormat('ORC')->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

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

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

# 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.ORC
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.orc"
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

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

require "google/cloud/bigquery"

def load_table_gcs_orc_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.orc"

  load_job = dataset.load_job table_id,
                              gcs_uri,
                              format: "orc",
                              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

ORC 轉換

BigQuery 會將 ORC 資料類型轉換為下列 BigQuery 資料類型:

原始類型

ORC 資料類型 BigQuery 資料類型 附註
boolean BOOLEAN
byte INTEGER
short INTEGER
int INTEGER
long INTEGER
float FLOAT
double FLOAT
string STRING 僅限 UTF-8
varchar STRING 僅限 UTF-8
char STRING 僅限 UTF-8
binary BYTES
date DATE
timestamp TIMESTAMP ORC 支援奈秒精確度,但當讀取資料時,BigQuery 會將小於微秒的值轉換為微秒。
decimal NUMERIC 或 STRING NUMERIC 類型為總位數 38 位數及小數位數 9 位數的精確數值。詳情請參閱 NUMERIC 類型。如果 ORC 結構定義中 decimal 類型的小數位數不超過 9 位數,總位數 (包含小數位數) 不超過 29 位數,會將其轉換為 NUMERIC。否則,會將其轉換為 STRING。若將 decimal 類型轉換為 STRING,會傳回警告訊息。

複合類型

ORC 資料類型 BigQuery 資料類型 附註
struct RECORD
  • 所有欄位均為 NULLABLE。
  • 系統會忽略欄位順序。
  • 欄位名稱必須為有效的欄名稱
map<K,V> RECORD         ORC map<K,V> 欄位會轉換為重複的 RECORD,其中包含兩個欄位:相同資料類型的鍵為 K,以及相同資料類型的值為 V。這兩個欄位都是 NULLABLE。
list 重複欄位 不支援巢狀清單與對應清單。
union RECORD
  • 當 union 只有一個變因時,會將其轉換為 NULLABLE 欄位。
  • 否則,會將 union 轉換為含有 NULLABLE 欄位清單的 RECORD。NULLABLE 欄位的後置字串為 field_0、field_1,依此類推。讀取資料時,只會為其中一個欄位指派值。

欄名稱

資料欄名稱只能包含英文字母 (a-z、A-Z)、數字 (0-9) 或底線 (_),且開頭必須為英文字母或底線。資料欄名稱的長度上限為 128 個字元。資料欄名稱不得使用以下任何一個前置字元:

  • _TABLE_
  • _FILE_
  • _PARTITION

資料欄名稱不得重複,即便其情況不同也是如此。舉例來說,系統會將名為 Column1 的欄視為與 column1 欄的名稱相同。

NULL

請注意,目前 BigQuery 會忽略 list 複合類型的 NULL 元素。

如要深入瞭解 ORC 資料類型,請參閱 Apache ORC™ 規格 v1

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

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

這個網頁