Memuat data CSV dari Cloud Storage

Saat memuat data CSV dari Cloud Storage, Anda dapat memuat data ke dalam tabel atau partisi baru, atau Anda dapat menambahkan ke atau menimpa tabel atau partisi yang sudah ada. Setelah dimuat ke BigQuery, data Anda akan dikonversi ke dalam format berbasis kolom untuk Capacitor (format penyimpanan BigQuery).

Saat memuat data dari Cloud Storage ke tabel BigQuery, set data yang berisi tabel harus berada di lokasi regional atau multi- regional yang sama dengan bucket Cloud Storage.

Untuk informasi tentang cara memuat data CSV dari file lokal, lihat Memuat data ke BigQuery dari sumber data lokal.

Cobalah sendiri

Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa BigQuery dalam skenario dunia nyata. Pelanggan baru mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.

Coba BigQuery gratis

Batasan

Anda harus tunduk kepada batasan berikut saat memuat data ke BigQuery dari bucket Cloud Storage:

  • Jika lokasi set data Anda ditetapkan ke nilai selain multi-region US, bucket Cloud Storage harus berada di region yang sama atau berada dalam multi-region yang sama dengan set data tersebut.
  • BigQuery tidak menjamin konsistensi data untuk sumber data eksternal. Perubahan pada data yang mendasari saat kueri berjalan dapat menyebabkan perilaku yang tidak terduga.
  • BigQuery tidak mendukung pembuatan versi objek Cloud Storage. Jika Anda menyertakan nomor pembuatan dalam Cloud Storage URI, tugas pemuatan akan gagal.

Saat Anda memuat file CSV ke BigQuery, perhatikan hal berikut:

  • File CSV tidak mendukung data bertingkat atau berulang.
  • Menghapus karakter tanda urutan byte (BOM). Hal tersebut dapat menyebabkan masalah yang tidak terduga.
  • Jika Anda menggunakan kompresi gzip, BigQuery tidak dapat membaca data secara paralel. Memuat data CSV terkompresi ke BigQuery akan lebih lambat dibandingkan pemuatan data yang tidak dikompresi. Lihat Memuat data yang dikompresi dan tidak dikompresi.
  • Anda tidak dapat menyertakan file yang dikompresi dan tidak dikompresi dalam tugas pemuatan yang sama.
  • Ukuran maksimum file gzip adalah 4 GB.
  • Memuat data CSV menggunakan deteksi otomatis skema tidak otomatis mendeteksi header jika semua kolom berjenis string. Dalam hal ini, tambahkan kolom numerik ke input atau deklarasikan skema secara eksplisit.
  • Saat Anda memuat data CSV atau JSON, nilai dalam kolom DATE harus menggunakan pemisah tanda hubung (-) dan tanggal harus dalam format berikut: YYYY-MM-DD (tahun-bulan -hari).
  • Saat Anda memuat data JSON atau CSV, nilai dalam kolom TIMESTAMP harus menggunakan tanda hubung (-) atau garis miring (/) untuk bagian tanggal stempel waktu, dan tanggal harus dalam salah satu format berikut: YYYY-MM-DD (tahun-bulan-hari) atau YYYY/MM/DD (tahun/bulan/hari). Bagian hh:mm:ss (jam-menit-detik) dari stempel waktu harus menggunakan pemisah titik dua (:).
  • Memuat data CSV menggunakan deteksi otomatis skema tidak mendukung nama kolom fleksibel secara default. Untuk mendaftar dalam pratinjau ini, isi formulir pendaftaran.
  • File Anda harus memenuhi batas ukuran file CSV yang dijelaskan dalam batas tugas pemuatan.

Sebelum memulai

Berikan peran Identity and Access Management (IAM) yang memberi pengguna izin yang diperlukan untuk melakukan setiap tugas dalam dokumen ini, dan buat set data untuk menyimpan data Anda.

Izin yang diperlukan

Untuk memuat data ke BigQuery, Anda memerlukan izin IAM untuk menjalankan tugas pemuatan dan memuat data ke dalam tabel dan partisi BigQuery. Jika memuat data dari Cloud Storage, Anda juga memerlukan izin IAM untuk mengakses bucket yang berisi data Anda.

Izin untuk memuat data ke BigQuery

Untuk memuat data ke dalam tabel atau partisi BigQuery baru, atau menambahkan atau menimpa tabel atau partisi yang sudah ada, Anda memerlukan izin IAM berikut:

  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.tables.update
  • bigquery.jobs.create

Setiap peran IAM yang telah ditetapkan berikut mencakup izin yang diperlukan untuk memuat data ke dalam tabel atau partisi BigQuery:

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin (termasuk izin bigquery.jobs.create)
  • bigquery.user (termasuk izin bigquery.jobs.create)
  • bigquery.jobUser (termasuk izin bigquery.jobs.create)

Selain itu, jika memiliki izin bigquery.datasets.create, Anda dapat membuat dan memperbarui tabel menggunakan tugas pemuatan dalam set data yang Anda buat.

Untuk mengetahui informasi selengkapnya tentang peran dan izin IAM di BigQuery, lihat Peran dan izin yang telah ditetapkan.

Izin untuk memuat data dari Cloud Storage

Untuk mendapatkan izin yang Anda perlukan untuk memuat data dari bucket Cloud Storage, minta administrator Anda untuk memberi Anda peran IAM Storage Admin (roles/storage.admin) di bucket. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

Peran yang telah ditentukan ini berisi izin yang diperlukan untuk memuat data dari bucket Cloud Storage. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk memuat data dari bucket Cloud Storage:

  • storage.buckets.get
  • storage.objects.get
  • storage.objects.list (required if you are using a URI wildcard)

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran lainnya yang telah ditetapkan sebelumnya.

Membuat set data

Membuat set data BigQuery untuk menyimpan data Anda.

Kompresi CSV

Anda dapat menggunakan utilitas gzip untuk mengompresi file CSV. Perhatikan bahwa gzip melakukan kompresi file lengkap, tidak seperti kompresi konten file yang dilakukan oleh codec kompresi untuk format file lain, seperti Avro. Menggunakan gzip untuk mengompresi file CSV mungkin akan memengaruhi performa; untuk informasi selengkapnya tentang kompromi, lihat Memuat data yang dikompresi dan tidak dikompresi.

Memuat data CSV ke tabel

Untuk memuat data CSV dari Cloud Storage ke tabel BigQuery yang baru, pilih salah satu opsi berikut:

Konsol


Untuk mengikuti panduan langkah demi langkah tugas ini langsung di Cloud Shell Editor, klik Pandu Saya:

Pandu saya


  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda, lalu pilih set data.
  3. Di bagian Dataset info, klik Create table.
  4. Di panel Create table, tentukan detail berikut:
    1. Di bagian Source, pilih Google Cloud Storage dalam daftar Create table from. Kemudian, lakukan hal berikut:
      1. Pilih file dari bucket Cloud Storage, atau masukkan Cloud Storage URI. Anda tidak dapat menyertakan beberapa URI di Konsol Google Cloud, tetapi karakter pengganti bisa didukung. Bucket Cloud Storage harus berada di lokasi yang sama dengan set data yang berisi tabel yang ingin Anda buat, tambahkan, atau timpa. pilih file sumber untuk membuat tabel BigQuery
      2. Untuk File format, pilih CSV.
    2. Di bagian Destination, tentukan detail berikut:
      1. Untuk Dataset, pilih set data tempat Anda ingin membuat tabel.
      2. Di kolom Table, masukkan nama tabel yang ingin Anda buat.
      3. Pastikan kolom Table type disetel ke Native table.
    3. Di bagian Schema, masukkan definisi schema. Untuk mengaktifkan deteksi otomatis dari suatu skema, pilih Auto detect. Anda dapat memasukkan informasi skema secara manual menggunakan salah satu metode berikut:
      • Opsi 1: Klik Edit as text dan tempelkan skema dalam bentuk array JSON. Saat menggunakan array JSON, Anda menghasilkan skema menggunakan proses yang sama seperti membuat file skema JSON. Anda dapat melihat skema tabel yang ada dalam format JSON dengan memasukkan perintah berikut:
            bq show --format=prettyjson dataset.table
            
      • Opsi 2: Klik Add field, lalu masukkan skema tabel. Tentukan Name, Type, dan Mode untuk setiap kolom.
    4. Opsional: Tentukan Partition and cluster settings. Untuk mengetahui informasi selengkapnya, lihat Membuat tabel berpartisi serta Membuat dan menggunakan tabel yang dikelompokkan.
    5. Klik Advanced options, lalu lakukan tindakan berikut:
      • Untuk Write preference, biarkan Write if empty dipilih. Opsi ini akan membuat tabel baru dan memuat data Anda ke dalamnya.
      • Untuk Number of errors allowed, terima nilai default 0 atau masukkan jumlah maksimum baris berisi error yang dapat diabaikan. Jika jumlah baris yang berisi error melebihi nilai ini, tugas akan menghasilkan pesan invalid dan gagal. Opsi ini hanya berlaku untuk file CSV dan JSON.
      • Jika Anda ingin mengabaikan nilai dalam baris yang tidak ada dalam skema tabel, pilih Unknown values.
      • Sebagai Pembatas kolom , pilih karakter yang memisahkan sel dalam file CSV Anda: Koma dan Tab dan Pipa , atau Khusus singkat ini. Jika memilih Custom, masukkan pemisah dalam kotak Custom field delimiter. Nilai defaultnya adalah Comma
      • Untuk Header rows to skip, masukkan jumlah baris header yang akan dilewati di bagian atas file CSV. Nilai defaultnya adalah 0.
      • Untuk Baris baru yang dikutip, centang Izinkan baris baru yang dikutip untuk mengizinkan bagian data yang dikutip yang berisi karakter baris baru dalam file CSV. Nilai defaultnya adalah false.
      • Untuk Jagged rows, centang Allow jagged rows untuk menerima baris dalam file CSV yang tidak memiliki kolom opsional di akhir. Nilai yang hilang diperlakukan sebagai null. Jika tidak dicentang, kumpulan data dengan kolom di belakangnya yang hilang diperlakukan sebagai kumpulan data buruk, dan jika ada terlalu banyak kumpulan data buruk, error yang tidak valid akan ditampilkan dalam hasil tugas. Nilai defaultnya adalah false.
      • Untuk Encryption, klik Customer-managed key untuk menggunakan Cloud Key Management Service key. Jika Anda membiarkan setelan Google-managed key, BigQuery akan mengenkripsi data dalam penyimpanan.
    6. Klik Buat tabel.

SQL

Gunakan pernyataan DDL LOAD DATA. Contoh berikut memuat file CSV ke tabel baru mytable:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    LOAD DATA OVERWRITE mydataset.mytable
    (x INT64,y STRING)
    FROM FILES (
      format = 'CSV',
      uris = ['gs://bucket/path/file.csv']);

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

bq

Gunakan perintah bq load, tentukan CSV menggunakan flag --source_format, dan sertakan Cloud Storage URI. Anda dapat menyertakan URI tunggal, daftar URI yang dipisahkan koma, atau URI yang berisi karakter pengganti. Berikan skema secara inline, dalam file definisi skema, atau gunakan deteksi otomatis skema. Jika Anda tidak menentukan skema, dan --autodetect adalah false, serta tabel tujuan tersedia, skema tabel tujuan akan digunakan.

(Opsional) Berikan flag --location dan tetapkan nilainya ke lokasi Anda.

Flag opsional lainnya meliputi:

  • --allow_jagged_rows: Jika ditentukan, terima baris dalam file CSV yang tidak memiliki kolom opsional di akhir. Nilai yang hilang diperlakukan sebagai null. Jika tidak dicentang, kumpulan data dengan kolom di akhir yang hilang akan diperlakukan sebagai data yang buruk, dan jika ada terlalu banyak data buruk, error yang tidak valid akan ditampilkan dalam hasil tugas. Nilai defaultnya adalah false.
  • --allow_quoted_newlines: Jika ditentukan, mengizinkan bagian data yang dikutip yang berisi karakter baris baru dalam file CSV. Nilai defaultnya adalah false.
  • --field_delimiter: Karakter yang menunjukkan batas antara kolom dalam data. \t dan tab diizinkan untuk pembatas tab. Nilai defaultnya adalah ,.
  • --null_marker: String kustom opsional yang mewakili nilai NULL dalam data CSV.
  • --skip_leading_rows: Menentukan jumlah baris header yang akan dilewati di bagian atas file CSV. Nilai defaultnya adalah 0.
  • --quote: Karakter kutipan yang digunakan untuk menyertakan kumpulan data. Nilai defaultnya adalah ". Untuk menunjukkan tidak ada karakter kutip, gunakan string kosong.
  • --max_bad_records: Bilangan bulat yang menentukan jumlah maksimum kumpulan data buruk yang diizinkan sebelum seluruh tugas gagal. Nilai defaultnya adalah 0. Maksimal lima error dari jenis apa pun akan ditampilkan, terlepas dari nilai --max_bad_records.
  • --ignore_unknown_values: Jika ditentukan, mengizinkan dan mengabaikan nilai tambahan yang tidak dikenali dalam data CSV atau JSON.
  • --autodetect: Jika ditentukan, mengaktifkan deteksi otomatis skema untuk data CSV dan JSON.
  • --time_partitioning_type: Mengaktifkan partisi berbasis waktu pada tabel dan menetapkan jenis partisi. Nilai yang mungkin adalah HOUR, DAY, MONTH, dan YEAR. Flag ini bersifat opsional saat Anda membuat tabel yang dipartisi pada kolom DATE, DATETIME, atau TIMESTAMP. Jenis partisi default untuk partisi berbasis waktu adalah DAY. Anda tidak dapat mengubah spesifikasi partisi pada tabel yang ada.
  • --time_partitioning_expiration: Bilangan bulat yang menentukan (dalam detik) kapan partisi berbasis waktu harus dihapus. Waktu habis masa berlaku bernilai tanggal UTC partisi ditambah nilai bilangan bulat.
  • --time_partitioning_field: Kolom DATE atau TIMESTAMP yang digunakan untuk membuat tabel yang dipartisi. Jika partisi berbasis waktu diaktifkan tanpa nilai ini, tabel berpartisi berdasarkan waktu penyerapan akan dibuat.
  • --require_partition_filter: Jika diaktifkan, opsi ini mengharuskan pengguna menyertakan klausa WHERE yang menentukan partisi yang akan dikueri. Mengharuskan penggunaan filter partisi dapat mengurangi biaya dan meningkatkan performa. Untuk mengetahui informasi selengkapnya, lihat Membuat kueri tabel berpartisi.
  • --clustering_fields: Daftar yang dipisahkan koma yang berisi maksimum empat nama kolom yang digunakan untuk membuat tabel yang dikelompokkan.
  • --destination_kms_key: Kunci Cloud KMS untuk enkripsi data tabel.

    Untuk informasi selengkapnya tentang perintah bq load, lihat:

    Untuk informasi selengkapnya tentang tabel berpartisi, lihat:

    Untuk mengetahui informasi selengkapnya tentang tabel yang dikelompokkan, lihat:

    Untuk mengetahui informasi selengkapnya tentang enkripsi tabel, lihat:

Untuk memuat data CSV ke BigQuery, masukkan perintah berikut:

bq --location=location load \
--source_format=format \
dataset.table \
path_to_source \
schema

Dengan keterangan:

  • location adalah lokasi Anda. Flag --location bersifat opsional. Misalnya, jika menggunakan BigQuery di region Tokyo, Anda dapat menetapkan nilai flag ke asia-northeast1. Anda dapat menetapkan nilai default untuk lokasi menggunakan file .bigqueryrc.
  • format sebesar CSV.
  • dataset adalah set data yang sudah ada.
  • table adalah nama tabel tempat Anda memuat data.
  • path_to_source adalah Cloud Storage URI yang sepenuhnya memenuhi syarat atau daftar URI yang dipisahkan koma. Karakter pengganti juga didukung.
  • schema adalah skema yang valid. Skema dapat berupa file JSON lokal, atau dapat diketik sebagai bagian dari perintah. Anda juga dapat menggunakan flag --autodetect, alih-alih memberikan definisi skema.

Contoh:

Perintah berikut memuat data dari gs://mybucket/mydata.csv ke tabel bernama mytable di mydataset. Skema ditentukan dalam file skema lokal bernama myschema.json.

    bq load \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

Perintah berikut memuat data dari gs://mybucket/mydata.csv ke tabel bernama mytable di mydataset. Skema ditentukan dalam file skema lokal bernama myschema.json. File CSV menyertakan dua baris header: Jika --skip_leading_rows tidak ditentukan, perilaku default-nya adalah menganggap file tidak berisi header.

    bq load \
    --source_format=CSV \
    --skip_leading_rows=2
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

Perintah berikut memuat data dari gs://mybucket/mydata.csv ke tabel berpartisi berdasarkan waktu penyerapan bernama mytable di mydataset. Skema ditentukan dalam file skema lokal bernama myschema.json.

    bq load \
    --source_format=CSV \
    --time_partitioning_type=DAY \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

Perintah berikut memuat data dari gs://mybucket/mydata.csv ke tabel berpartisi baru bernama mytable di mydataset. Tabel dipartisi pada kolom mytimestamp. Skema ditetapkan dalam file skema lokal bernama myschema.json.

    bq load \
    --source_format=CSV \
    --time_partitioning_field mytimestamp \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

Perintah berikut memuat data dari gs://mybucket/mydata.csv ke tabel bernama mytable di mydataset. Skema terdeteksi secara otomatis.

    bq load \
    --autodetect \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv

Perintah berikut memuat data dari gs://mybucket/mydata.csv ke tabel bernama mytable di mydataset. Skema ditentukan sebagai bagian dari dalam format field:data_type,field:data_type.

    bq load \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    qtr:STRING,sales:FLOAT,year:STRING

Perintah berikut memuat data dari beberapa file di gs://mybucket/ ke dalam tabel bernama mytable di mydataset. URI Cloud Storage menggunakan karakter pengganti. Skema terdeteksi secara otomatis.

    bq load \
    --autodetect \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata*.csv

Perintah berikut memuat data dari beberapa file di gs://mybucket/ ke dalam tabel bernama mytable di mydataset. Perintah ini menyertakan daftar URI Cloud Storage yang dipisahkan koma dengan karakter pengganti. Skema ditentukan dalam file skema lokal bernama myschema.json.

    bq load \
    --source_format=CSV \
    mydataset.mytable \
    "gs://mybucket/00/*.csv","gs://mybucket/01/*.csv" \
    ./myschema.json

API

  1. Buat tugas load yang mengarah ke data sumber di Cloud Storage.

  2. (Opsional) Tentukan lokasi Anda di properti location di bagian jobReference pada resource tugas.

  3. Properti source URIs harus sepenuhnya memenuhi syarat, dalam format gs://bucket/object. Setiap URI dapat berisi satu karakter pengganti '*'.

  4. Tentukan format data CSV dengan menetapkan properti sourceFormat ke CSV.

  5. Untuk memeriksa status tugas, panggil jobs.get(job_id*), dengan job_id yang merupakan ID tugas yang ditampilkan oleh permintaan awal.

    • Jika statusnya status.state = DONE, tugas berhasil diselesaikan.
    • Jika properti status.errorResult ada, permintaan gagal, dan objek tersebut akan menyertakan informasi yang menjelaskan penyebabnya. Jika permintaan gagal, tidak ada tabel yang dibuat dan tidak ada data yang dimuat.
    • Jika status.errorResult tidak ada, tugas berhasil diselesaikan, meskipun mungkin ada beberapa error non-fatal, seperti masalah mengimpor beberapa baris. Error non-fatal tercantum dalam properti status.errors objek tugas yang ditampilkan.

Catatan API:

  • Tugas pemuatan bersifat atomik dan konsisten. Jika tugas pemuatan gagal, tidak ada data yang tersedia, dan jika tugas pemuatan berhasil, semua datanya tersedia.

  • Sebagai praktik terbaik, buat ID unik dan teruskan sebagai jobReference.jobId saat memanggil jobs.insert untuk membuat tugas pemuatan. Pendekatan ini lebih tangguh untuk kegagalan jaringan karena klien dapat melakukan polling atau mencoba ulang ID tugas yang diketahui.

  • Memanggil jobs.insert pada ID tugas tertentu bersifat idempoten. Anda dapat mencoba lagi sebanyak yang Anda inginkan pada ID tugas yang sama, dan maksimal satu dari operasi tersebut akan berhasil.

C#

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C# di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery C# API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryLoadTableGcsCsv
{
    public void LoadTableGcsCsv(
        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.csv";
        var dataset = client.GetDataset(datasetId);
        var schema = new TableSchemaBuilder {
            { "name", BigQueryDbType.String },
            { "post_abbr", BigQueryDbType.String }
        }.Build();
        var destinationTableRef = dataset.GetTableReference(
            tableId: "us_states");
        // Create job configuration
        var jobOptions = new CreateLoadJobOptions()
        {
            // The source format defaults to CSV; line below is optional.
            SourceFormat = FileFormat.Csv,
            SkipLeadingRows = 1
        };
        // Create and run job
        var loadJob = client.CreateLoadJob(
            sourceUri: gcsURI, destination: destinationTableRef,
            schema: schema, options: jobOptions);
        loadJob = loadJob.PollUntilCompleted().ThrowOnAnyError();  // 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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// importCSVExplicitSchema demonstrates loading CSV data from Cloud Storage into a BigQuery
// table and providing an explicit schema for the data.
func importCSVExplicitSchema(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.csv")
	gcsRef.SkipLeadingRows = 1
	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())
	}
	return nil
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CsvOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.TableId;

// Sample to load CSV data from Cloud Storage into a new BigQuery table
public class LoadCsvFromGcs {

  public static void runLoadCsvFromGcs() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv";
    Schema schema =
        Schema.of(
            Field.of("name", StandardSQLTypeName.STRING),
            Field.of("post_abbr", StandardSQLTypeName.STRING));
    loadCsvFromGcs(datasetName, tableName, sourceUri, schema);
  }

  public static void loadCsvFromGcs(
      String datasetName, String tableName, String sourceUri, Schema schema) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // Skip header row in the file.
      CsvOptions csvOptions = CsvOptions.newBuilder().setSkipLeadingRows(1).build();

      TableId tableId = TableId.of(datasetName, tableName);
      LoadJobConfiguration loadConfig =
          LoadJobConfiguration.newBuilder(tableId, sourceUri, csvOptions).setSchema(schema).build();

      // Load data from a GCS CSV file into the table
      Job job = bigquery.create(JobInfo.of(loadConfig));
      // Blocks until this load table job completes its execution, either failing or succeeding.
      job = job.waitFor();
      if (job.isDone()) {
        System.out.println("CSV from GCS successfully added during load append job");
      } else {
        System.out.println(
            "BigQuery was unable to load into the table due to an error:"
                + job.getStatus().getError());
      }
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Column not added during load append \n" + e.toString());
    }
  }
}

Node.js

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Node.js API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

// Instantiate clients
const bigquery = new BigQuery();
const storage = new Storage();

/**
 * 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.csv';

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

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

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

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(storage.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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan PHP di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery PHP API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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.csv';
$schema = [
    'fields' => [
        ['name' => 'name', 'type' => 'string'],
        ['name' => 'post_abbr', 'type' => 'string']
    ]
];
$loadConfig = $table->loadFromStorage($gcsUri)->schema($schema)->skipLeadingRows(1);
$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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Gunakan metode Client.load_table_from_uri() untuk memuat data dari file CSV di Cloud Storage. Sediakan definisi skema eksplisit dengan menetapkan properti LoadJobConfig.schema ke daftar objek SchemaField.

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
    ],
    skip_leading_rows=1,
    # The source format defaults to CSV, so the line below is optional.
    source_format=bigquery.SourceFormat.CSV,
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

destination_table = client.get_table(table_id)  # Make an API request.
print("Loaded {} rows.".format(destination_table.num_rows))

Ruby

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Ruby di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Ruby API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

require "google/cloud/bigquery"

def load_table_gcs_csv 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.csv"
  table_id = "us_states"

  load_job = dataset.load_job table_id, gcs_uri, skip_leading: 1 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

Memuat data CSV ke tabel yang menggunakan partisi waktu berbasis kolom

Untuk memuat data CSV dari Cloud Storage ke tabel BigQuery yang menggunakan partisi waktu berbasis kolom:

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.


import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// importPartitionedTable demonstrates specifing time partitioning for a BigQuery table when loading
// CSV data from Cloud Storage.
func importPartitionedTable(projectID, destDatasetID, destTableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states-by-date.csv")
	gcsRef.SkipLeadingRows = 1
	gcsRef.Schema = bigquery.Schema{
		{Name: "name", Type: bigquery.StringFieldType},
		{Name: "post_abbr", Type: bigquery.StringFieldType},
		{Name: "date", Type: bigquery.DateFieldType},
	}
	loader := client.Dataset(destDatasetID).Table(destTableID).LoaderFrom(gcsRef)
	loader.TimePartitioning = &bigquery.TimePartitioning{
		Field:      "date",
		Expiration: 90 * 24 * time.Hour,
	}
	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())
	}
	return nil
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.FormatOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TimePartitioning;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.UUID;

public class LoadPartitionedTable {

  public static void runLoadPartitionedTable() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "/path/to/file.csv";
    loadPartitionedTable(datasetName, tableName, sourceUri);
  }

  public static void loadPartitionedTable(String datasetName, String tableName, String sourceUri)
      throws Exception {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Schema schema =
          Schema.of(
              Field.of("name", StandardSQLTypeName.STRING),
              Field.of("post_abbr", StandardSQLTypeName.STRING),
              Field.of("date", StandardSQLTypeName.DATE));

      // Configure time partitioning. For full list of options, see:
      // https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#TimePartitioning
      TimePartitioning partitioning =
          TimePartitioning.newBuilder(TimePartitioning.Type.DAY)
              .setField("date")
              .setExpirationMs(Duration.of(90, ChronoUnit.DAYS).toMillis())
              .build();

      LoadJobConfiguration loadJobConfig =
          LoadJobConfiguration.builder(tableId, sourceUri)
              .setFormatOptions(FormatOptions.csv())
              .setSchema(schema)
              .setTimePartitioning(partitioning)
              .build();

      // Create a job ID so that we can safely retry.
      JobId jobId = JobId.of(UUID.randomUUID().toString());
      Job loadJob = bigquery.create(JobInfo.newBuilder(loadJobConfig).setJobId(jobId).build());

      // Load data from a GCS parquet file into the table
      // Blocks until this load table job completes its execution, either failing or succeeding.
      Job completedJob = loadJob.waitFor();

      // Check for errors
      if (completedJob == null) {
        throw new Exception("Job not executed since it no longer exists.");
      } else if (completedJob.getStatus().getError() != null) {
        // You can also look at queryJob.getStatus().getExecutionErrors() for all
        // errors, not just the latest one.
        throw new Exception(
            "BigQuery was unable to load into the table due to an error: \n"
                + loadJob.getStatus().getError());
      }
      System.out.println("Data successfully loaded into time partitioned table during load job");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println(
          "Data not loaded into time partitioned table during load job \n" + e.toString());
    }
  }
}

Node.js

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Node.js API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

// Instantiate clients
const bigquery = new BigQuery();
const storage = new Storage();

/**
 * 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-by-date.csv';

async function loadTablePartitioned() {
  // Load data into a table that uses column-based time partitioning.

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

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad
  const partitionConfig = {
    type: 'DAY',
    expirationMs: '7776000000', // 90 days
    field: 'date',
  };

  const metadata = {
    sourceFormat: 'CSV',
    skipLeadingRows: 1,
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
        {name: 'date', type: 'DATE'},
      ],
    },
    location: 'US',
    timePartitioning: partitionConfig,
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(storage.bucket(bucketName).file(filename), metadata);

  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);
}

Python

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
        bigquery.SchemaField("date", "DATE"),
    ],
    skip_leading_rows=1,
    time_partitioning=bigquery.TimePartitioning(
        type_=bigquery.TimePartitioningType.DAY,
        field="date",  # Name of the column to use for partitioning.
        expiration_ms=7776000000,  # 90 days.
    ),
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states-by-date.csv"

load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Wait for the job to complete.

table = client.get_table(table_id)
print("Loaded {} rows to table {}".format(table.num_rows, table_id))

Menambahkan atau menimpakan data CSV ke tabel

Anda dapat memuat data tambahan ke dalam tabel dari file sumber atau dengan menambahkan hasil kueri.

Di Konsol Google Cloud, gunakan opsi Write preference untuk menentukan tindakan yang harus diambil ketika Anda memuat data dari file sumber atau dari hasil kueri.

Anda memiliki opsi berikut saat memuat data tambahan ke dalam tabel:

Opsi konsol flag alat bq Properti BigQuery API Deskripsi
Tulis jika kosong Tidak didukung WRITE_EMPTY Menulis data hanya jika tabel kosong.
Tambahkan ke tabel --noreplace atau --replace=false; jika --[no]replace tidak ditentukan, defaultnya adalah menambahkan WRITE_APPEND (Default) Menambahkan data ke akhir tabel.
Timpa tabel --replace atau --replace=true WRITE_TRUNCATE Menghapus semua data yang ada di tabel sebelum menulis data baru. Tindakan ini juga akan menghapus skema tabel dan keamanan tingkat baris, serta menghapus kunci Cloud KMS apa pun.

Jika Anda memuat data ke dalam tabel yang sudah ada, tugas pemuatan dapat menambahkan data atau menimpa tabel.

Konsol

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project Anda, lalu pilih set data.
  3. Di bagian Dataset info, klik Create table.
  4. Di panel Create table, tentukan detail berikut:
    1. Di bagian Source, pilih Google Cloud Storage dalam daftar Create table from. Kemudian, lakukan hal berikut:
      1. Pilih file dari bucket Cloud Storage, atau masukkan Cloud Storage URI. Anda tidak dapat menyertakan beberapa URI di Konsol Google Cloud, tetapi karakter pengganti bisa didukung. Bucket Cloud Storage harus berada di lokasi yang sama dengan set data yang berisi tabel yang ingin Anda buat, tambahkan, atau timpa. pilih file sumber untuk membuat tabel BigQuery
      2. Untuk File format, pilih CSV.
    2. Di bagian Destination, tentukan detail berikut:
      1. Untuk Dataset, pilih set data tempat Anda ingin membuat tabel.
      2. Di kolom Table, masukkan nama tabel yang ingin Anda buat.
      3. Pastikan kolom Table type disetel ke Native table.
    3. Di bagian Schema, masukkan definisi schema. Untuk mengaktifkan deteksi otomatis dari suatu skema, pilih Auto detect. Anda dapat memasukkan informasi skema secara manual menggunakan salah satu metode berikut:
      • Opsi 1: Klik Edit as text dan tempelkan skema dalam bentuk array JSON. Saat menggunakan array JSON, Anda menghasilkan skema menggunakan proses yang sama seperti membuat file skema JSON. Anda dapat melihat skema tabel yang ada dalam format JSON dengan memasukkan perintah berikut:
            bq show --format=prettyjson dataset.table
            
      • Opsi 2: Klik Add field, lalu masukkan skema tabel. Tentukan Name, Type, dan Mode untuk setiap kolom.
    4. Opsional: Tentukan Partition and cluster settings. Untuk mengetahui informasi selengkapnya, lihat Membuat tabel berpartisi serta Membuat dan menggunakan tabel yang dikelompokkan. Anda tidak dapat mengonversi tabel menjadi tabel berpartisi atau tabel yang dikelompokkan dengan menambahkan atau menimpanya. Konsol Google Cloud tidak mendukung penambahan ke atau penimpaan tabel berpartisi atau tabel yang dikelompokkan dalam tugas pemuatan.
    5. Klik Advanced options, lalu lakukan tindakan berikut:
      • Untuk Write preference, pilih Append to table atau Overwrite table.
      • Untuk Number of errors allowed, terima nilai default 0 atau masukkan jumlah maksimum baris berisi error yang dapat diabaikan. Jika jumlah baris yang berisi error melebihi nilai ini, tugas akan menghasilkan pesan invalid dan gagal. Opsi ini hanya berlaku untuk file CSV dan JSON.
      • Jika Anda ingin mengabaikan nilai dalam baris yang tidak ada dalam skema tabel, pilih Unknown values.
      • Sebagai Pembatas kolom , pilih karakter yang memisahkan sel dalam file CSV Anda: Koma dan Tab dan Pipa , atau Khusus singkat ini. Jika memilih Custom, masukkan pemisah dalam kotak Custom field delimiter. Nilai defaultnya adalah Comma
      • Untuk Header rows to skip, masukkan jumlah baris header yang akan dilewati di bagian atas file CSV. Nilai defaultnya adalah 0.
      • Untuk Baris baru yang dikutip, centang Izinkan baris baru yang dikutip untuk mengizinkan bagian data yang dikutip yang berisi karakter baris baru dalam file CSV. Nilai defaultnya adalah false.
      • Untuk Jagged rows, centang Allow jagged rows untuk menerima baris dalam file CSV yang tidak memiliki kolom opsional di akhir. Nilai yang hilang diperlakukan sebagai null. Jika tidak dicentang, kumpulan data dengan kolom di belakangnya yang hilang diperlakukan sebagai kumpulan data buruk, dan jika ada terlalu banyak kumpulan data buruk, error yang tidak valid akan ditampilkan dalam hasil tugas. Nilai defaultnya adalah false.
      • Untuk Encryption, klik Customer-managed key untuk menggunakan Cloud Key Management Service key. Jika Anda membiarkan setelan Google-managed key, BigQuery akan mengenkripsi data dalam penyimpanan.
    6. Klik Buat tabel.

SQL

Gunakan pernyataan DDL LOAD DATA. Contoh berikut menambahkan file CSV ke tabel mytable:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    LOAD DATA INTO mydataset.mytable
    FROM FILES (
      format = 'CSV',
      uris = ['gs://bucket/path/file.csv']);

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

bq

Gunakan perintah bq load, tentukan CSV menggunakan flag --source_format, dan sertakan Cloud Storage URI. Anda dapat menyertakan URI tunggal, daftar URI yang dipisahkan koma, atau URI yang berisi karakter pengganti.

Berikan skema secara inline, dalam file definisi skema, atau gunakan deteksi otomatis skema. Jika Anda tidak menentukan skema, dan --autodetect adalah false, serta tabel tujuan tersedia, skema tabel tujuan akan digunakan.

Tentukan flag --replace untuk menimpa tabel. Gunakan flag --noreplace untuk menambahkan data ke tabel. Jika tidak ada flag yang ditentukan, defaultnya adalah menambahkan data.

Skema tabel dapat diubah saat Anda menambahkan atau menimpanya. Untuk mengetahui informasi selengkapnya tentang perubahan skema yang didukung selama operasi pemuatan, lihat Mengubah skema tabel.

(Opsional) Berikan flag --location dan tetapkan nilainya ke lokasi Anda.

Flag opsional lainnya meliputi:

  • --allow_jagged_rows: Jika ditentukan, terima baris dalam file CSV yang tidak memiliki kolom opsional di akhir. Nilai yang hilang diperlakukan sebagai null. Jika tidak dicentang, kumpulan data dengan kolom di akhir yang hilang akan diperlakukan sebagai data yang buruk, dan jika ada terlalu banyak data buruk, error yang tidak valid akan ditampilkan dalam hasil tugas. Nilai defaultnya adalah false.
  • --allow_quoted_newlines: Jika ditentukan, mengizinkan bagian data yang dikutip yang berisi karakter baris baru dalam file CSV. Nilai defaultnya adalah false.
  • --field_delimiter: Karakter yang menunjukkan batas antara kolom dalam data. \t dan tab diizinkan untuk pembatas tab. Nilai defaultnya adalah ,.
  • --null_marker: String kustom opsional yang mewakili nilai NULL dalam data CSV.
  • --skip_leading_rows: Menentukan jumlah baris header yang akan dilewati di bagian atas file CSV. Nilai defaultnya adalah 0.
  • --quote: Karakter kutipan yang digunakan untuk menyertakan kumpulan data. Nilai defaultnya adalah ". Untuk menunjukkan tidak ada karakter kutip, gunakan string kosong.
  • --max_bad_records: Bilangan bulat yang menentukan jumlah maksimum kumpulan data buruk yang diizinkan sebelum seluruh tugas gagal. Nilai defaultnya adalah 0. Maksimal lima error dari jenis apa pun akan ditampilkan, terlepas dari nilai --max_bad_records.
  • --ignore_unknown_values: Jika ditentukan, mengizinkan dan mengabaikan nilai tambahan yang tidak dikenali dalam data CSV atau JSON.
  • --autodetect: Jika ditentukan, mengaktifkan deteksi otomatis skema untuk data CSV dan JSON.
  • --destination_kms_key: Kunci Cloud KMS untuk enkripsi data tabel.
bq --location=location load \
--[no]replace \
--source_format=format \
dataset.table \
path_to_source \
schema

dengan keterangan:

  • location adalah lokasi Anda. Flag --location bersifat opsional. Anda dapat menetapkan nilai default untuk lokasi menggunakan file.bigqueryrc.
  • format sebesar CSV.
  • dataset adalah set data yang sudah ada.
  • table adalah nama tabel tempat Anda memuat data.
  • path_to_source adalah Cloud Storage URI yang sepenuhnya memenuhi syarat atau daftar URI yang dipisahkan koma. Karakter pengganti juga didukung.
  • schema adalah skema yang valid. Skema dapat berupa file JSON lokal, atau dapat diketik sebagai bagian dari perintah. Anda juga dapat menggunakan flag --autodetect, alih-alih memberikan definisi skema.

Contoh:

Perintah berikut memuat data dari gs://mybucket/mydata.csv dan menimpa tabel bernama mytable di mydataset. Skema ditentukan menggunakan deteksi otomatis skema.

    bq load \
    --autodetect \
    --replace \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv

Perintah berikut memuat data dari gs://mybucket/mydata.csv dan menambahkan data ke tabel bernama mytable di mydataset. Skema ditentukan menggunakan file skema JSON — myschema.json.

    bq load \
    --noreplace \
    --source_format=CSV \
    mydataset.mytable \
    gs://mybucket/mydata.csv \
    ./myschema.json

API

  1. Buat tugas load yang mengarah ke data sumber di Cloud Storage.

  2. (Opsional) Tentukan lokasi Anda di properti location di bagian jobReference pada resource tugas.

  3. Properti source URIs harus sepenuhnya memenuhi syarat, dalam format gs://bucket/object. Anda dapat menyertakan beberapa URI sebagai daftar yang dipisahkan koma. Perlu diperhatikan bahwa karakter pengganti juga didukung.

  4. Tentukan format data dengan menetapkan properti configuration.load.sourceFormat ke CSV.

  5. Tentukan preferensi tulis dengan menetapkan properti configuration.load.writeDisposition ke WRITE_TRUNCATE atau WRITE_APPEND.

Go

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Go API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// importCSVTruncate demonstrates loading data from CSV data in Cloud Storage and overwriting/truncating
// data in the existing table.
func importCSVTruncate(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.csv")
	gcsRef.SourceFormat = bigquery.CSV
	gcsRef.AutoDetect = true
	gcsRef.SkipLeadingRows = 1
	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())
	}
	return nil
}

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.FormatOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.JobInfo.WriteDisposition;
import com.google.cloud.bigquery.LoadJobConfiguration;
import com.google.cloud.bigquery.TableId;

// Sample to overwrite the BigQuery table data by loading a CSV file from GCS
public class LoadCsvFromGcsTruncate {

  public static void runLoadCsvFromGcsTruncate() throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String sourceUri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv";
    loadCsvFromGcsTruncate(datasetName, tableName, sourceUri);
  }

  public static void loadCsvFromGcsTruncate(String datasetName, String tableName, String sourceUri)
      throws Exception {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      LoadJobConfiguration configuration =
          LoadJobConfiguration.builder(tableId, sourceUri)
              .setFormatOptions(FormatOptions.csv())
              // Set the write disposition to overwrite existing table data
              .setWriteDisposition(WriteDisposition.WRITE_TRUNCATE)
              .build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      // Load the table
      Job loadJob = bigquery.create(JobInfo.of(configuration));

      // Load data from a GCS parquet file into the table
      // Blocks until this load table job completes its execution, either failing or succeeding.
      Job completedJob = loadJob.waitFor();

      // Check for errors
      if (completedJob == null) {
        throw new Exception("Job not executed since it no longer exists.");
      } else if (completedJob.getStatus().getError() != null) {
        // You can also look at queryJob.getStatus().getExecutionErrors() for all
        // errors, not just the latest one.
        throw new Exception(
            "BigQuery was unable to load into the table due to an error: \n"
                + loadJob.getStatus().getError());
      }
      System.out.println("Table is successfully overwritten by CSV file loaded from GCS");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Column not added during load append \n" + e.toString());
    }
  }
}

Node.js

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Node.js API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Untuk mengganti baris dalam tabel yang ada, tetapkan nilai writeDisposition dalam parameter metadata ke 'WRITE_TRUNCATE'.

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

// Instantiate clients
const bigquery = new BigQuery();
const storage = new Storage();

/**
 * 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.csv';

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

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

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad
  const metadata = {
    sourceFormat: 'CSV',
    skipLeadingRows: 1,
    schema: {
      fields: [
        {name: 'name', type: 'STRING'},
        {name: 'post_abbr', type: 'STRING'},
      ],
    },
    // 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 bigquery
    .dataset(datasetId)
    .table(tableId)
    .load(storage.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;
  }
}

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan PHP di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery PHP API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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.csv';
$loadConfig = $table->loadFromStorage($gcsUri)->skipLeadingRows(1)->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

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Python API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Untuk mengganti baris dalam tabel yang ada, tetapkan properti LoadJobConfig.write_disposition ke konstan SourceFormat, WRITE_TRUNCATE.

import six

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name

job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("name", "STRING"),
        bigquery.SchemaField("post_abbr", "STRING"),
    ],
)

body = six.BytesIO(b"Washington,WA")
client.load_table_from_file(body, table_id, job_config=job_config).result()
previous_rows = client.get_table(table_id).num_rows
assert previous_rows > 0

job_config = bigquery.LoadJobConfig(
    write_disposition=bigquery.WriteDisposition.WRITE_TRUNCATE,
    source_format=bigquery.SourceFormat.CSV,
    skip_leading_rows=1,
)

uri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"
load_job = client.load_table_from_uri(
    uri, table_id, job_config=job_config
)  # Make an API request.

load_job.result()  # Waits for the job to complete.

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

Memuat data CSV yang dipartisi hive

BigQuery mendukung pemuatan data CSV yang dipartisi hive yang disimpan di Cloud Storage dan akan mengisi kolom partisi hive sebagai kolom dalam tabel terkelola BigQuery tujuan. Untuk informasi selengkapnya, baca Memuat Data Berpartisi secara Eksternal dari Cloud Storage.

Detail pemuatan data CSV

Bagian ini menjelaskan cara BigQuery menangani berbagai opsi pemformatan CSV.

Encoding

BigQuery akan menerima data CSV berenkode UTF-8. Jika memiliki file CSV dengan jenis encoding lain yang didukung, Anda harus secara eksplisit menentukan encoding agar BigQuery dapat mengonversi data ke UTF-8 dengan benar.

BigQuery mendukung jenis encoding berikut untuk file CSV:

  • UTF-8
  • ISO-8859-1
  • UTF-16BE (UTF-16 Big Endian)
  • UTF-16LE (UTF-16 Little Endian)
  • UTF-32BE (UTF-32 Big Endian)
  • UTF-32LE (UTF-32 Little Endian)

Jika Anda tidak menentukan encoding, atau jika Anda menentukan encoding UTF-8 saat file CSV tidak berenkode UTF-8, BigQuery akan mencoba mengonversi data ke UTF-8. Umumnya, jika file CSV dienkode ISO-8859-1, data Anda akan berhasil dimuat, tetapi mungkin tidak sama persis dengan yang Anda harapkan. Jika file CSV berenkode UTF-16BE, UTF-16LE, UTF-32BE, atau UTF-32LE, pemuatan mungkin akan gagal. Untuk menghindari kegagalan tak terduga, tentukan encoding yang benar menggunakan flag --encoding.

Jika BigQuery tidak dapat mengonversi karakter selain karakter 0 ASCII, BigQuery akan mengonversi karakter tersebut menjadi karakter pengganti Unicode standar: �.

Field delimiter

Pemisah dalam file CSV dapat berupa karakter byte tunggal apa pun. Jika file sumber menggunakan encoding ISO-8859-1, setiap karakter dapat menjadi pemisah. Jika file sumber menggunakan encoding UTF-8, karakter apa pun dalam rentang desimal 1-127 (U+0001-U+007F) dapat digunakan tanpa modifikasi. Anda dapat menyisipkan karakter ISO-8859-1 di luar rentang ini sebagai pemisah, dan BigQuery akan menafsirkannya dengan benar. Namun, jika Anda menggunakan karakter multibyte sebagai pembatas, beberapa byte akan salah ditafsirkan sebagai bagian dari nilai kolom.

Secara umum, praktik terbaiknya adalah menggunakan pembatas standar, seperti tab, pipa, atau koma. Defaultnya adalah koma.

Jenis data

Boolean. BigQuery dapat mengurai salah satu pasangan berikut untuk data Boolean: 1 atau 0, benar atau salah, t atau f, ya atau tidak, atau y atau n (semua tidak peka huruf besar/kecil). Skema deteksi otomatis otomatis mendeteksi salah satu dari tiga hal tersebut, kecuali 0 dan 1.

Bytes. Kolom dengan jenis BYTES harus dienkode sebagai Base64.

Date. Kolom dengan jenis DATE harus dalam format YYYY-MM-DD.

Datetime. Kolom dengan jenis DATETIME harus dalam format YYYY-MM-DD HH:MM:SS[.SSSSSS].

Geography. Kolom dengan jenis GEOGRAPHY harus berisi string dalam salah satu format berikut:

  • Well-known text (WKT)
  • Well-known binary (WKB)
  • GeoJSON

Jika Anda menggunakan WKB, nilainya harus berenkode hex.

Daftar berikut menunjukkan contoh data yang valid:

  • WKT: POINT(1 2)
  • GeoJSON: { "type": "Point", "coordinates": [1, 2] }
  • WKB dengan enkode heksadesimal: 0101000000feffffffffffef3f0000000000000040

Sebelum memuat data GEOGRAPHY, baca juga Memuat data geospasial.

Interval. Kolom dengan jenis INTERVAL harus dalam format Y-M D H:M:S[.F], dengan:

  • Y = Year (Tahun). Rentang yang didukung adalah 0-10.000.
  • M = Month (Bulan). Rentang yang didukung adalah 1-12.
  • D = Day (Hari). Rentang yang didukung adalah 1-[hari terakhir pada bulan yang ditunjukkan].
  • H = Hour (Jam).
  • M = Minute (Menit).
  • S = Second (Detik).
  • [.F] = Pecahan detik hingga enam digit, dengan presisi mikrodetik.

Anda dapat menunjukkan nilai negatif dengan menambahkan tanda hubung (-).

Daftar berikut menunjukkan contoh data yang valid:

  • 10-6 0 0:0:0
  • 0-0 -5 0:0:0
  • 0-0 0 0:0:1.25

Untuk memuat data INTERVAL, Anda harus menggunakan perintah bq load dan menggunakan flag --schema untuk menentukan skema. Anda tidak dapat mengupload data INTERVAL dengan menggunakan konsol.

JSON. Tanda kutip di-escape dengan menggunakan urutan dua karakter "". Untuk informasi selengkapnya, lihat contoh memuat data JSON dari file CSV

Time. Kolom dengan jenis TIME harus dalam format HH:MM:SS[.SSSSSS].

Timestamp. BigQuery menerima berbagai format stempel waktu. Stempel waktu harus menyertakan bagian tanggal dan bagian waktu.

  • Bagian tanggal dapat diformat sebagai YYYY-MM-DD atau YYYY/MM/DD.

  • Bagian stempel waktu harus diformat sebagai HH:MM[:SS[.SSSSSS]] (detik dan fraksi detik bersifat opsional).

  • Tanggal dan waktu harus dipisahkan dengan spasi atau 'T'.

  • Secara opsional, tanggal dan waktu dapat diikuti dengan offset UTC atau penanda zona UTC (Z). Untuk mengetahui informasi selengkapnya, lihat Zona waktu.

Misalnya, salah satu dari berikut ini adalah nilai stempel waktu yang valid:

  • 2018-08-19 12:11
  • 2018-08-19 12:11:35
  • 2018-08-19 12:11:35.22
  • 2018/08/19 12:11
  • 2018-07-05 12:54:00 UTC
  • 2018-08-19 07:11:35.220 -05:00
  • 2018-08-19T12:11:35.220Z

Jika Anda memberikan skema, BigQuery juga menerima waktu epoch Unix untuk nilai stempel waktu. Namun, deteksi otomatis skema tidak mendeteksi kasus ini, dan memperlakukan nilai sebagai jenis numerik atau string.

Contoh nilai stempel waktu Unix epoch:

  • 1534680695
  • 1.534680695e11

RANGE (pratinjau). Direpresentasikan dalam file CSV dalam format [LOWER_BOUND, UPPER_BOUND), dengan LOWER_BOUND dan UPPER_BOUND adalah string DATE, DATETIME, atau TIMESTAMP yang valid. NULL dan UNBOUNDED mewakili nilai awal atau akhir yang tidak terbatas.

Berikut adalah contoh nilai CSV untuk RANGE<DATE>:

  • "[2020-01-01, 2021-01-01)"
  • "[UNBOUNDED, 2021-01-01)"
  • "[2020-03-01, NULL)"
  • "[UNBOUNDED, UNBOUNDED)"

Deteksi otomatis skema

Bagian ini menjelaskan perilaku deteksi otomatis skema saat memuat file CSV.

Delimiter CSV

BigQuery mendeteksi pembatas berikut:

  • koma ( , )
  • garis vertikal ( | )
  • tab ( \t )

Header CSV

BigQuery menyimpulkan header dengan membandingkan baris pertama file dengan baris lain dalam file. Jika baris pertama hanya berisi string, dan baris lainnya berisi jenis data lain, BigQuery mengasumsikan bahwa baris pertama adalah baris header. BigQuery menetapkan nama kolom berdasarkan nama kolom di baris header. Nama mungkin diubah agar memenuhi aturan penamaan untuk kolom di BigQuery. Misalnya, spasi akan diganti dengan garis bawah.

Jika tidak, BigQuery akan menganggap baris pertama sebagai baris data, dan menetapkan nama kolom generik seperti string_field_1. Perhatikan bahwa setelah tabel dibuat, nama kolom tidak dapat diperbarui dalam skema, meskipun Anda dapat mengubah nama secara manual setelah tabel dibuat. Pilihan lainnya adalah menyediakan skema eksplisit daripada menggunakan deteksi otomatis.

Anda mungkin memiliki file CSV dengan baris header, dengan semua kolom datanya berupa string. Dalam hal ini, BigQuery tidak akan secara otomatis mendeteksi bahwa baris pertama adalah sebuah header. Gunakan opsi --skip_leading_rows untuk melewati baris header. Jika tidak, header akan diimpor sebagai data. Dalam kasus ini, pertimbangkan juga untuk memberikan skema eksplisit sehingga Anda dapat menetapkan nama kolom.

Baris baru yang dikutip CSV

BigQuery mendeteksi karakter baris baru yang dikutip dalam kolom CSV dan tidak menafsirkan karakter baris baru yang dikutip sebagai batas baris.

Memecahkan masalah error penguraian

Jika terjadi error saat mengurai file CSV, resource errors tugas pemuatan akan diisi dengan detail error.

Umumnya, error ini mengidentifikasi awal baris yang bermasalah dengan offset byte. Untuk file yang tidak dikompresi, Anda dapat menggunakan gsutil dengan argumen -r untuk mengakses baris yang relevan.

Misalnya, Anda menjalankan perintah bq load dan menerima error:

bq load
    --skip_leading_rows=1 \
    --source_format=CSV \
    mydataset.mytable \
    gs://my-bucket/mytable.csv \
    'Number:INTEGER,Name:STRING,TookOffice:STRING,LeftOffice:STRING,Party:STRING'

Error dalam output mirip dengan yang berikut ini:

Waiting on bqjob_r5268069f5f49c9bf_0000018632e903d7_1 ... (0s)
Current status: DONE
BigQuery error in load operation: Error processing job
'myproject:bqjob_r5268069f5f49c9bf_0000018632e903d7_1': Error while reading
data, error message: Error detected while parsing row starting at position: 1405.
Error: Data between close quote character (") and field separator.
File: gs://my-bucket/mytable.csv
Failure details:
- gs://my-bucket/mytable.csv: Error while reading data,
error message: Error detected while parsing row starting at
position: 1405. Error: Data between close quote character (") and
field separator. File: gs://my-bucket/mytable.csv
- Error while reading data, error message: CSV processing encountered
too many errors, giving up. Rows: 22; errors: 1; max bad: 0; error
percent: 0

Berdasarkan error sebelumnya, ada error format dalam file. Untuk melihat konten file, jalankan perintah gsutil cat:

gsutil cat -r 1405-1505 gs://my-bucket/mytable.csv

Outputnya mirip dengan hal berikut ini:

16,Abraham Lincoln,"March 4, 1861","April 15, "1865,Republican
18,Ulysses S. Grant,"March 4, 1869",
...

Berdasarkan output file, masalahnya adalah tanda kutip yang salah tempat dalam "April 15, "1865.

File CSV yang dikompresi

Proses debug error penguraian lebih sulit untuk file CSV yang dikompresi, karena offset byte yang dilaporkan mengacu pada lokasi dalam file yang tidak dikompresi. Perintah gsutil cat berikut mengalirkan file dari Cloud Storage, mendekompresi file, mengidentifikasi offset byte yang sesuai, dan mencetak baris dengan error format:

gsutil cat gs://my-bucket/mytable.csv.gz | gunzip - | tail -c +1406 | head -n 1

Outputnya mirip dengan hal berikut ini:

16,Abraham Lincoln,"March 4, 1861","April 15, "1865,Republican

Opsi CSV

Untuk mengubah cara BigQuery mengurai data CSV, tentukan opsi tambahan di Konsol Google Cloud, alat command line bq, atau API.

Untuk informasi selengkapnya tentang format CSV, lihat RFC 4180.

Opsi CSV Opsi konsol flag alat bq Properti BigQuery API Deskripsi
Field delimiter Pemisah kolom: Koma, Tab, Pipa, Kustom -F atau --field_delimiter fieldDelimiter (Java, Python) (Opsional) Pemisah untuk kolom dalam file CSV. Pemisah dapat berupa karakter byte tunggal ISO-8859-1. BigQuery mengonversi string menjadi encoding ISO-8859-1, dan menggunakan byte pertama dari string yang dienkode untuk membagi data dalam status biner mentahnya. BigQuery juga mendukung urutan escape "\t" untuk menentukan pemisah tab. Nilai defaultnya adalah koma (`,`).
Baris header Baris header yang dilewati: --skip_leading_rows skipLeadingRows (Java, Python) (Opsional) Bilangan bulat yang menunjukkan jumlah baris header dalam data sumber.
Jumlah kumpulan data buruk yang diizinkan Jumlah error yang diizinkan: --max_bad_records maxBadRecords (Java, Python) (Opsional) Jumlah maksimum data buruk yang dapat diabaikan BigQuery saat menjalankan tugas. Jika jumlah kumpulan data buruk melebihi nilai ini, error tidak valid akan ditampilkan di hasil tugas. Nilai defaultnya adalah 0, yang mengharuskan semua kumpulan data valid.
Karakter baris baru Izinkan baris baru dengan tanda kutip --allow_quoted_newlines allowQuotedNewlines (Java, Python) (Opsional) Menunjukkan apakah akan mengizinkan bagian data yang dikutip yang berisi karakter baris baru dalam file CSV. Nilai defaultnya adalah false.
Nilai null kustom Tidak ada --null_marker nullMarker (Java, Python) (Opsional) Menentukan string yang mewakili nilai null dalam file CSV. Misalnya, jika Anda menentukan "\N", BigQuery akan menafsirkan "\N" sebagai nilai null saat memuat file CSV. Nilai defaultnya adalah string kosong. Jika Anda menetapkan properti ini ke nilai khusus, BigQuery akan menampilkan error jika string kosong ada untuk semua jenis data, kecuali untuk STRING dan BYTE. Untuk kolom STRING dan BYTE, BigQuery menafsirkan string kosong sebagai nilai kosong.
Kolom opsional di akhir Izinkan jagged row --allow_jagged_rows allowJaggedRows (Java, Python) (Opsional) Terima baris yang tidak memiliki kolom opsional di akhir. Nilai yang hilang diperlakukan sebagai null. Jika salah, kumpulan data yang tidak memiliki kolom di akhir akan dianggap sebagai kumpulan data buruk, dan jika ada terlalu banyak kumpulan data buruk, error tidak valid akan ditampilkan dalam hasil tugas. Nilai defaultnya adalah false. Hanya berlaku untuk CSV, diabaikan untuk format lainnya.
Nilai yang tidak diketahui Abaikan nilai yang tidak diketahui --ignore_unknown_values ignoreUnknownValues (Java, Python) (Opsional) Menunjukkan apakah BigQuery harus mengizinkan nilai tambahan yang tidak direpresentasikan dalam skema tabel. Jika true (benar), nilai tambahan akan diabaikan. Jika false, kumpulan data dengan kolom tambahan akan dianggap sebagai kumpulan data buruk, dan jika ada terlalu banyak kumpulan data yang buruk, error yang tidak valid akan ditampilkan dalam hasil tugas. Nilai defaultnya adalah false. Properti sourceFormat menentukan apa yang diperlakukan BigQuery sebagai nilai tambahan:
  • CSV: Kolom di akhir
  • JSON: Nilai bernama yang tidak cocok dengan nama kolom apa pun
Penawaran harga Karakter tanda kutip: Tanda kutip ganda, Tanda kutip tunggal, Tidak ada, Kustom --quote quote (Java, Python) (Opsional) Nilai yang digunakan untuk mengutip bagian data dalam file CSV. BigQuery mengonversi string menjadi encoding ISO-8859-1, lalu menggunakan byte pertama dari string yang dienkode untuk membagi data dalam status biner mentahnya. Nilai defaultnya adalah tanda kutip ganda ('"'). Jika data Anda tidak berisi bagian yang dikutip, tetapkan nilai properti menjadi string kosong. Jika data Anda berisi karakter baris baru yang dikutip, Anda juga harus menetapkan properti allowQuotedNewlines ke true. Untuk menyertakan karakter tanda kutip tertentu dalam nilai yang dikutip, awali dengan karakter tanda kutip tambahan yang cocok. Misalnya, jika ingin meng-escape karakter default ' " ', gunakan ' "" '.
Encoding Tidak ada -E atau --encoding encoding (Java, Python) (Opsional) Encoding karakter data. Nilai yang didukung adalah UTF-8, ISO-8859-1, UTF-16BE, UTF-16LE, UTF-32BE, atau UTF-32LE. Nilai defaultnya adalah UTF-8. BigQuery mendekode data setelah data biner mentah dibagi menggunakan nilai properti quote dan fieldDelimiter.
Karakter kontrol ASCII Tidak ada --preserve_ascii_control_characters Tidak ada (Opsional) Jika Anda ingin mengizinkan ASCII 0 dan karakter kontrol ASCII lainnya, tetapkan --preserve_ascii_control_characters ke true untuk tugas pemuatan Anda.