Mengelola tabel berpartisi

Dokumen ini menjelaskan cara mengelola tabel berpartisi di BigQuery.

Mendapatkan metadata partisi

Anda bisa mendapatkan informasi tentang tabel berpartisi dengan cara berikut:

Mendapatkan metadata partisi menggunakan tampilan INFORMATION_SCHEMA

Saat Anda membuat kueri tampilan INFORMATION_SCHEMA.PARTITIONS, hasil kueri akan berisi satu baris untuk setiap partisi. Misalnya, kueri berikut mencantumkan semua partisi tabel dalam set data bernama mydataset:

SELECT table_name, partition_id, total_rows
FROM `mydataset.INFORMATION_SCHEMA.PARTITIONS`
WHERE partition_id IS NOT NULL

Untuk mengetahui informasi selengkapnya, lihat INFORMATION_SCHEMA.PARTITIONS.

Mendapatkan metadata partisi menggunakan tabel meta

Pada legacy SQL, Anda bisa mendapatkan metadata tentang partisi tabel dengan membuat kueri tabel meta __PARTITIONS_SUMMARY__. Tabel meta adalah tabel hanya-baca yang berisi metadata.

Buat kueri tabel meta __PARTITIONS_SUMMARY__ sebagai berikut:

#legacySQL
SELECT
  column
FROM
  [dataset.table$__PARTITIONS_SUMMARY__]

Tabel meta __PARTITIONS_SUMMARY__ memiliki kolom berikut:

Nilai Deskripsi
project_id Nama project.
dataset_id Nama set data.
table_id Nama tabel berpartisi waktu.
partition_id Nama (tanggal) partisi.
creation_time Waktu pembuatan partisi, dalam milidetik sejak 1 Januari 1970 UTC.
last_modified_time Waktu saat partisi terakhir diubah, dalam milidetik sejak 1 Januari 1970 UTC.

Setidaknya, untuk menjalankan tugas kueri yang menggunakan tabel meta __PARTITIONS_SUMMARY__, Anda harus diberi izin bigquery.jobs.create dan izin bigquery.tables.getData.

Untuk mengetahui informasi selengkapnya tentang peran IAM di BigQuery, lihat Kontrol akses.

Menyetel masa berlaku partisi

Saat membuat tabel berpartisi berdasarkan waktu penyerapan atau kolom satuan waktu, Anda dapat menentukan masa berlaku partisi. Setelan ini menentukan berapa lama BigQuery menyimpan data di setiap partisi. Setelan ini berlaku untuk semua partisi dalam tabel, tetapi dihitung secara terpisah untuk setiap partisi berdasarkan waktu partisi.

Waktu habis masa berlaku partisi dihitung dari batas partisi dalam UTC. Misalnya, dengan partisi harian, batas partisi adalah tengah malam (00:00:00 UTC). Jika masa berlaku partisi tabel adalah 6 jam, setiap partisi akan berakhir masa berlakunya pada pukul 06.00.00 UTC pada hari berikutnya. Ketika masa berlaku sebuah partisi berakhir, BigQuery akan menghapus data dalam partisi tersebut.

Anda juga dapat menentukan masa berlaku partisi default pada tingkat set data. Jika Anda menetapkan masa berlaku partisi di tabel, nilai tersebut akan menggantikan masa berlaku partisi default. Jika Anda tidak menentukan masa berlaku partisi (pada tabel atau set data), masa berlaku partisi tidak akan pernah habis.

Jika Anda menetapkan masa berlaku tabel, nilai tersebut akan lebih diprioritaskan daripada masa berlaku partisi. Misalnya, jika masa berlaku tabel ditetapkan menjadi 5 hari, dan masa berlaku partisi ditetapkan menjadi 7 hari, tabel dan semua partisi di dalamnya akan dihapus setelah 5 hari.

Anda dapat memperbarui masa berlaku partisi tabel kapan pun setelah tabel dibuat. Setelan baru berlaku untuk semua partisi dalam tabel tersebut, terlepas dari kapan partisi tersebut dibuat. Partisi yang ada akan segera habis masa berlakunya jika lebih lama dari waktu habis masa berlaku yang baru. Demikian pula, jika data disalin atau dimasukkan ke tabel yang dipartisi berdasarkan kolom unit waktu, setiap partisi yang lebih lama dari masa berlaku partisi yang dikonfigurasi untuk tabel akan langsung habis masa berlakunya.

Saat masa berlaku partisi berakhir, BigQuery akan menghapus partisi tersebut. Data partisi dipertahankan sesuai dengan kebijakan perjalanan waktu dan fail-safe, dan dapat ditagih, bergantung pada model penagihan Anda. Hingga waktu tersebut, partisi tetap dihitung untuk tujuan kuota tabel. Untuk segera menghapus partisi, Anda dapat menghapus partisi secara manual.

Memperbarui masa berlaku partisi

Untuk memperbarui masa berlaku partisi tabel berpartisi:

Konsol

Anda tidak dapat memperbarui masa berlaku partisi di Konsol Google Cloud.

SQL

Gunakan pernyataan ALTER TABLE SET OPTIONS. Contoh berikut memperbarui masa berlaku hingga 5 hari. Untuk menghapus masa berlaku partisi untuk sebuah tabel, tetapkan partition_expiration_days ke NULL.

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        -- Sets partition expiration to 5 days
        partition_expiration_days = 5);

  3. Klik Run.

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

bq

Jalankan perintah bq update dengan flag --time_partitioning_expiration. Jika Anda memperbarui tabel berpartisi dalam project selain project default, tambahkan project ID ke nama set data dalam format berikut: project_id:dataset.

bq update \
--time_partitioning_expiration integer_in_seconds \
--time_partitioning_type unit_time \
project_id:dataset.table

Dengan keterangan:

  • integer adalah masa aktif default (dalam detik) untuk partisi tabel. Tidak ada nilai minimum. Waktu habis masa berlaku bernilai tanggal partisi ditambah nilai bilangan bulat. Jika Anda menentukan 0, masa berlaku partisi akan dihapus, dan tidak akan pernah berakhir. Partisi yang tidak memiliki masa berlaku harus dihapus secara manual.
  • unit_time dapat berupa DAY, HOUR, MONTH, atau YEAR, berdasarkan tingkat perincian partisi tabel. Nilai ini harus cocok dengan tingkat perincian yang Anda tetapkan saat membuat tabel.
  • project_id adalah project ID Anda.
  • dataset adalah nama set data yang berisi tabel yang Anda perbarui.
  • table adalah nama tabel yang Anda perbarui.

Contoh:

Masukkan perintah berikut untuk memperbarui waktu habis masa berlaku partisi dalam mydataset.mytable menjadi 5 hari (432.000 detik). mydataset ada dalam project default Anda.

bq update --time_partitioning_expiration 432000 mydataset.mytable

Masukkan perintah berikut untuk memperbarui waktu habis masa berlaku partisi dalam mydataset.mytable menjadi 5 hari (432.000 detik). mydataset ada di myotherproject, bukan di project default Anda.

bq update \
--time_partitioning_expiration 432000 \
myotherproject:mydataset.mytable

API

Panggil metode tables.patch dan gunakan properti timePartitioning.expirationMs untuk memperbarui masa berlaku partisi dalam milidetik. Karena metode tables.update menggantikan seluruh resource tabel, metode tables.patch akan lebih disarankan.

Menetapkan persyaratan filter partisi

Saat membuat tabel berpartisi, Anda dapat mewajibkan semua kueri pada tabel harus menyertakan filter predikat (klausa WHERE) yang memfilter kolom partisi. Setelan ini dapat meningkatkan performa dan mengurangi biaya, karena BigQuery dapat menggunakan filter untuk memangkas partisi yang tidak cocok dengan predikat.

Untuk informasi tentang cara menambahkan opsi Wajibkan filter partisi saat Anda membuat tabel berpartisi, lihat Membuat tabel berpartisi.

Jika sebuah tabel berpartisi memiliki setelan Wajibkan filter partisi, setiap kueri pada tabel tersebut harus menyertakan minimal satu predikat yang hanya merujuk ke kolom partisi. Kueri tanpa predikat seperti itu akan menampilkan error berikut:

Cannot query over table 'project_id.dataset.table' without a filter that can be used for partition elimination.

Untuk mengetahui informasi selengkapnya, lihat Membuat kueri tabel berpartisi.

Memperbarui persyaratan filter partisi

Jika Anda tidak mengaktifkan opsi Wajibkan filter partisi saat membuat tabel berpartisi, Anda dapat memperbarui tabel untuk menambahkan opsi tersebut.

Konsol

Anda tidak dapat menggunakan Konsol Google Cloud untuk mewajibkan filter partisi setelah tabel berpartisi dibuat.

SQL

Gunakan pernyataan ALTER TABLE SET OPTIONS untuk memperbarui persyaratan filter partisi. Contoh berikut memperbarui persyaratan menjadi true:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    ALTER TABLE mydataset.mypartitionedtable
      SET OPTIONS (
        require_partition_filter = true);

  3. Klik Run.

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

bq

Untuk memperbarui tabel berpartisi guna mewajibkan filter partisi dengan menggunakan alat command line bq, masukkan perintah bq update dan berikan flag --require_partition_filter.

Untuk memperbarui tabel berpartisi dalam project selain project default Anda, tambahkan project ID ke set data dalam format berikut: project_id:dataset.

Contoh:

Untuk mengupdate mypartitionedtable di mydataset dalam project default Anda, masukkan:

bq update --require_partition_filter mydataset.mytable

Untuk mengupdate mypartitionedtable dalam mydataset di myotherproject, masukkan:

bq update --require_partition_filter myotherproject:mydataset.mytable

API

Panggil metode tables.patch dan tetapkan properti requirePartitionFilter ke true untuk mewajibkan filter partisi. Karena metode tables.update menggantikan seluruh resource tabel, metode tables.patch akan lebih disarankan.

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 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.Table;

// Sample to update require partition filter on a table.
public class UpdateTableRequirePartitionFilter {

  public static void runUpdateTableRequirePartitionFilter() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateTableRequirePartitionFilter(datasetName, tableName);
  }

  public static void updateTableRequirePartitionFilter(String datasetName, String tableName) {
    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();

      Table table = bigquery.getTable(datasetName, tableName);
      table.toBuilder().setRequirePartitionFilter(true).build().update();

      System.out.println("Table require partition filter updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Table require partition filter was not updated \n" + e.toString());
    }
  }
}

Menyalin tabel berpartisi

Proses untuk menyalin tabel berpartisi sama dengan proses untuk menyalin tabel standar. Untuk mengetahui informasi selengkapnya, lihat Menyalin tabel.

Saat Anda menyalin tabel berpartisi, perhatikan hal-hal berikut:

  • Menyalin tabel berpartisi ke tabel tujuan baru
    Semua informasi partisi disalin dengan tabel. Tabel baru dan tabel lama akan memiliki partisi yang identik.
  • Menyalin tabel yang tidak berpartisi ke tabel berpartisi yang sudah ada
    Operasi ini hanya didukung untuk partisi waktu penyerapan. BigQuery menyalin data sumber ke dalam partisi yang mewakili tanggal saat ini. Operasi ini tidak didukung untuk tabel berpartisi kolom unit waktu atau tabel berpartisi rentang bilangan bulat.
  • Menyalin tabel berpartisi ke tabel berpartisi lain
    Spesifikasi partisi untuk tabel sumber dan tujuan harus cocok.
  • Menyalin tabel berpartisi ke tabel yang tidak dipartisi
    Tabel tujuan tetap tidak berpartisi.
  • Menyalin beberapa tabel yang berpartisi

    Jika Anda menyalin beberapa tabel sumber ke dalam tabel berpartisi dalam tugas yang sama, tabel sumber tidak boleh berisi campuran tabel berpartisi dan tidak berpartisi.

    Jika semua tabel sumber merupakan tabel berpartisi, spesifikasi partisi untuk semua tabel sumber harus sesuai dengan spesifikasi partisi tabel tujuan.

Saat menyalin ke tabel yang ada, Anda dapat menentukan akan menambahkan atau menimpa tabel tujuan.

Menyalin partisi satu per satu

Anda dapat menyalin data dari satu atau beberapa partisi ke tabel lain.

Konsol

Menyalin partisi tidak didukung oleh Konsol Google Cloud.

bq

Untuk menyalin partisi, gunakan perintah bq cp (salin) alat command line bq dengan dekorator partisi ($date) seperti $20160201.

Flag opsional dapat digunakan untuk mengontrol disposisi tulis partisi tujuan:

  • -a atau --append_table menambahkan data dari partisi sumber ke tabel atau partisi yang ada dalam set data tujuan.
  • -f atau --force menimpa tabel atau partisi yang ada di set data tujuan dan tidak meminta konfirmasi.
  • -n atau --no_clobber menampilkan pesan error berikut jika tabel atau partisi ada di set data tujuan: Table '<var>project_id:dataset.table</var> or <var>table$date</var>' already exists, skipping. Jika -n tidak ditentukan, perilaku default-nya adalah meminta Anda memilih apakah akan mengganti tabel atau partisi tujuan.
  • --destination_kms_key adalah kunci Cloud KMS yang dikelola pelanggan yang digunakan untuk mengenkripsi tabel atau partisi tujuan.

Perintah cp tidak mendukung flag --time_partitioning_field atau --time_partitioning_type. Anda tidak dapat menggunakan tugas penyalinan untuk mengonversi tabel berpartisi berdasarkan waktu penyerapan menjadi tabel berpartisi.

--destination_kms_key tidak ditunjukkan di sini. Lihat Melindungi data dengan kunci Cloud KMS untuk mengetahui informasi selengkapnya.

Jika set data sumber atau tujuan berada di project selain project default Anda, tambahkan project ID ke nama set data dalam format berikut: project_id:dataset.

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

bq --location=location cp \
-a -f -n \
project_id:dataset.source_table$source_partition \
project_id:dataset.destination_table$destination_partition

Dengan keterangan:

  • location adalah nama 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.
  • project_id adalah project ID Anda.
  • dataset adalah nama set data sumber atau tujuan.
  • source_table adalah tabel yang Anda salin.
  • source_partition adalah dekorator partisi dari partisi sumber.
  • destination_table adalah nama tabel dalam set data tujuan.
  • destination_partition adalah dekorator partisi dari partisi tujuan.

Contoh:

Menyalin partisi ke tabel baru

Masukkan perintah berikut untuk menyalin partisi 30 Januari 2018 dari mydataset.mytable ke tabel baru — mydataset.mytable2. mydataset berada dalam project default Anda.

bq cp -a 'mydataset.mytable$20180130' mydataset.mytable2

Menyalin partisi ke tabel yang tidak berpartisi

Masukkan perintah berikut untuk menyalin partisi 30 Januari 2018 dari mydataset.mytable ke tabel yang tidak berpartisi — mydataset2.mytable2. Pintasan -a digunakan untuk menambahkan data partisi ke tabel tujuan yang tidak berpartisi. Kedua set data ada di project default Anda.

bq cp -a 'mydataset.mytable$20180130' mydataset2.mytable2

Masukkan perintah berikut untuk menyalin partisi 30 Januari 2018 dari mydataset.mytable ke tabel yang tidak berpartisi — mydataset2.mytable2. Pintasan -f digunakan untuk menimpa tabel tujuan yang tidak berpartisi tanpa meminta.

bq --location=US cp -f 'mydataset.mytable$20180130' mydataset2.mytable2

Menyalin partisi ke tabel berpartisi lain

Masukkan perintah berikut untuk menyalin partisi 30 Januari 2018 dari mydataset.mytable ke tabel berpartisi lain — mydataset2.mytable2. Pintasan -a digunakan untuk menambahkan data partisi ke tabel tujuan. Karena tidak ada dekorator partisi yang ditentukan pada tabel tujuan, kunci partisi sumber dipertahankan dan data disalin ke partisi 30 Januari 2018 di tabel tujuan. Anda juga dapat menentukan dekorator partisi pada tabel tujuan untuk menyalin data ke partisi tertentu. mydataset ada dalam project default Anda. mydataset2 berada di myotherproject, bukan di project default Anda.

bq --location=US cp \
-a \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

Masukkan perintah berikut untuk menyalin partisi 30 Januari 2018 dari mydataset.mytable ke partisi 30 Januari 2018 dari tabel berpartisi lain — mydataset2.mytable2. Pintasan -f digunakan untuk menimpa partisi 30 Januari 2018 di tabel tujuan tanpa meminta. Jika tidak ada dekorator partisi yang digunakan, semua data dalam tabel tujuan akan ditimpa. mydataset ada dalam project default Anda. mydataset2 ada di myotherproject, bukan di project default Anda.

bq cp \
-f \
'mydataset.mytable$20180130' \
'myotherproject:mydataset2.mytable2$20180130'

Masukkan perintah berikut untuk menyalin partisi 30 Januari 2018 dari mydataset.mytable ke tabel berpartisi lain — mydataset2.mytable2. mydataset ada dalam project default Anda. mydataset2 berada di myotherproject, bukan di project default Anda. Jika ada data dalam tabel tujuan, perilaku default-nya adalah meminta Anda untuk menimpanya.

bq cp \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

Untuk menyalin beberapa partisi, tentukan partisi tersebut sebagai daftar yang dipisahkan koma:

bq cp \
'mydataset.mytable$20180130,mydataset.mytable$20180131' \
myotherproject:mydataset.mytable2

API

Panggil metode jobs.insert, dan konfigurasi tugas copy. (Opsional) Tentukan region Anda di properti location di bagian jobReference dari resource tugas.

Tetapkan properti berikut dalam konfigurasi tugas Anda:

  • Masukkan set data, tabel, dan partisi sumber di properti sourceTables.
  • Masukkan set data dan tabel tujuan di properti destinationTable.
  • Gunakan properti writeDisposition untuk menentukan akan menambahkan atau menimpa tabel atau partisi tujuan.

Untuk menyalin beberapa partisi, masukkan partisi sumber (termasuk set data dan nama tabel) di properti sourceTables.

Menghapus partisi

Anda dapat menghapus partisi satu per satu dari tabel berpartisi. Namun, Anda tidak dapat menghapus partisi __NULL__ atau __UNPARTITIONED__ khusus.

Anda hanya dapat menghapus partisi satu per satu.

Anda dapat menghapus partisi dengan menentukan dekorator partisi, kecuali salah satu dari dua partisi khusus.

Untuk menghapus partisi dalam tabel berpartisi:

Konsol

Konsol Google Cloud tidak mendukung penghapusan partisi.

SQL

Jika pernyataan DELETE yang memenuhi syarat mencakup semua baris dalam partisi, BigQuery akan menghapus seluruh partisi. Penghapusan ini dilakukan tanpa memindai byte atau menggunakan slot. Contoh pernyataan DELETE berikut mencakup seluruh partisi filter pada kolom semu _PARTITIONDATE:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    DELETE mydataset.mytable
    WHERE _PARTITIONDATE IN ('2076-10-07', '2076-03-06');

  3. Klik Run.

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

bq

Gunakan perintah bq rm dengan flag --table (atau pintasan -t) dan tentukan dekorator partisi untuk menghapus partisi tertentu.

bq rm --table project_id:dataset.table$partition

Dengan keterangan:

  • project_id adalah project ID Anda. Jika dihilangkan, project default Anda akan digunakan.
  • dataset adalah nama set data yang berisi tabel.
  • table adalah nama tabel.
  • partition adalah penghias partisi dari partisi yang Anda hapus.

Dekorator partisi memiliki format berikut, bergantung pada jenis partisi:

  • Partisi per jam: yyyymmddhh. Contoh: $2016030100.
  • Partisi harian: yyyymmdd. Contoh: $20160301.
  • Partisi bulanan: yyyymm. Contoh: $201603.
  • Partisi tahunan: yyyy. Contoh: $2016.
  • Partisi rentang bilangan bulat: Awal rentang partisi. Contoh: $20.

Alat command line bq akan meminta Anda untuk mengonfirmasi tindakan. Untuk melewati konfirmasi, gunakan flag --force (atau pintasan -f).

Contoh:

Hapus partisi untuk 1 Maret 2016 dalam tabel berpartisi harian bernama mydataset.mytable dalam project default Anda:

bq rm --table 'mydataset.mytable$20160301'

Hapus partisi untuk Maret 2016 dalam tabel berpartisi bulanan:

bq rm --table 'mydataset.mytable$201603'

Hapus rentang bilangan bulat mulai dari 20 dalam tabel berpartisi rentang bilangan bulat bernama mydataset.mytable:

bq rm --table 'mydataset.mytable$20'

API

Panggil metode tables.delete, lalu tentukan tabel dan dekorator partisi menggunakan parameter tableId.

Keamanan tabel berpartisi

Kontrol akses untuk tabel berpartisi sama dengan kontrol akses untuk tabel standar. Untuk mengetahui informasi selengkapnya, lihat Pengantar kontrol akses tabel.