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:
- Menggunakan tampilan
INFORMATION_SCHEMA.PARTITIONS
(Pratinjau). - Menggunakan tabel meta
__PARTITIONS_SUMMARY__
(khusus legacy SQL).
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 disisipkan ke tabel yang dipartisi oleh kolom satuan waktu, partisi yang lebih lama dari masa berlaku partisi yang dikonfigurasi untuk tabel akan segera habis masa berlakunya.
Saat masa berlaku partisi berakhir, data dalam partisi tersebut tidak lagi tersedia untuk kueri dan Anda tidak dikenai biaya untuk penyimpanan partisi tersebut. BigQuery pada akhirnya akan menghapus partisi yang telah habis masa berlakunya. 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
.
Di Konsol Google Cloud, buka halaman BigQuery.
Di editor kueri, masukkan pernyataan berikut:
ALTER TABLE mydataset.mytable SET OPTIONS ( -- Sets partition expiration to 5 days partition_expiration_days = 5);
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
, atauYEAR
, 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
:
Di konsol Google Cloud, buka halaman BigQuery.
Di editor kueri, masukkan pernyataan berikut:
ALTER TABLE mydataset.mypartitionedtable SET OPTIONS ( require_partition_filter = true);
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 mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.
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 keasia-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 tabel lain yang
dipartisi pada 20 Februari 2018 — mydataset2.mytable2
. Pintasan -f
digunakan
untuk menimpa partisi 20 Februari 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$20180220'
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 menghabiskan slot. Contoh pernyataan
DELETE
berikut mencakup seluruh partisi filter di
kolom pseudo _PARTITIONDATE
:
Di konsol Google Cloud, buka halaman BigQuery.
Di editor kueri, masukkan pernyataan berikut:
DELETE mydataset.mytable WHERE _PARTITIONDATE IN ('2076-10-07', '2076-03-06');
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.