Pengambilan sampel tabel
Dengan mengambil sampel tabel, Anda dapat membuat kueri subkumpulan data acak dari tabel BigQuery yang besar. Pengambilan sampel menampilkan berbagai kumpulan data sekaligus menghindari biaya yang terkait dengan pemindaian dan pemrosesan seluruh tabel.
Menggunakan pengambilan sampel tabel
Untuk dapat menggunakan pengambilan sampel tabel dalam kueri, sertakan
klausa
TABLESAMPLE
. Misalnya, kueri berikut memilih sekitar 10% dari data
tabel:
SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)
Tidak seperti klausa LIMIT
, TABLESAMPLE
menampilkan subset data acak dari
tabel. Selain itu, BigQuery tidak menyimpan hasil kueri yang menyertakan
klausa TABLESAMPLE
ke dalam cache sehingga kueri tersebut mungkin menampilkan hasil yang berbeda setiap
saat.
Anda dapat menggabungkan klausa TABLESAMPLE
dengan kondisi pemilihan lainnya. Contoh
berikut mengambil sampel sekitar 50% dari tabel, lalu menerapkan klausa
WHERE
:
SELECT *
FROM dataset.my_table TABLESAMPLE SYSTEM (50 PERCENT)
WHERE customer_id = 1
Contoh berikutnya menggabungkan klausa TABLESAMPLE
dengan klausa JOIN
:
SELECT *
FROM dataset.table1 T1 TABLESAMPLE SYSTEM (10 PERCENT)
JOIN dataset.table2 T2 TABLESAMPLE SYSTEM (20 PERCENT) USING (customer_id)
Untuk tabel yang lebih kecil, jika Anda menggabungkan dua sampel dan tidak ada baris sampel yang memenuhi kondisi penggabungan, Anda mungkin akan menerima hasil kosong.
Anda dapat menentukan persentase sebagai parameter kueri. Contoh berikutnya menunjukkan cara meneruskan persentase ke kueri menggunakan alat command line bq:
bq query --use_legacy_sql=false --parameter=percent:INT64:29 \
'SELECT * FROM `dataset.my_table` TABLESAMPLE SYSTEM (@percent PERCENT)`
Tabel BigQuery diatur ke dalam blok data. Klausa TABLESAMPLE
berfungsi dengan memilih persentase blok data dari tabel
secara acak dan membaca semua baris di blok yang dipilih. Perincian pengambilan sampel
dibatasi oleh jumlah blok data.
Biasanya, BigQuery membagi tabel atau partisi tabel menjadi blok
jika berukuran lebih dari 1 GB. Tabel yang lebih kecil mungkin terdiri dari satu
blok data. Dalam hal ini, klausa TABLESAMPLE
akan membaca seluruh tabel. Jika
persentase sampel lebih besar dari nol dan tabel tidak kosong, pengambilan sampel
tabel selalu menampilkan beberapa hasil.
Blok dapat memiliki berbagai ukuran sehingga fraksi akurat dari baris yang diambil sampelnya
dapat berbeda-beda. Jika ingin mengambil sampel baris satu per satu, bukan blok data, Anda
dapat menggunakan klausa WHERE rand() < K
. Namun, pendekatan ini memerlukan
BigQuery untuk dapat memindai seluruh tabel. Untuk menghemat biaya, tetapi tetap
memperoleh manfaat dari pengambilan sampel tingkat baris, Anda dapat menggabungkan kedua teknik tersebut.
Contoh berikut membaca sekitar 20% blok data dari penyimpanan, lalu memilih 10% baris dalam blok tersebut secara acak:
SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (20 PERCENT)
WHERE rand() < 0.1
Tabel eksternal
Anda dapat menggunakan klausa TABLESAMPLE
dengan tabel eksternal yang menyimpan data dalam
koleksi file. BigQuery mengambil sampel subset file eksternal
yang dirujuk oleh tabel. Untuk beberapa format file, BigQuery
dapat membagi setiap file ke dalam blok untuk pengambilan sampel. Beberapa data eksternal, seperti
data di Google Spreadsheet, terdiri dari satu file yang diambil sampelnya sebagai satu blok
data.
Pengambilan sampel dari penyimpanan yang dioptimalkan untuk penulisan
Jika Anda menggunakan pengambilan sampel tabel dengan streaming insert, BigQuery akan mengambil data sampel dari penyimpanan yang dioptimalkan untuk operasi tulis. Dalam beberapa kasus, semua data dalam penyimpanan yang dioptimalkan untuk operasi tulis direpresentasikan sebagai satu blok. Jika itu terjadi, semua data di penyimpanan yang dioptimalkan untuk operasi tulis akan muncul dalam hasil, atau tidak ada yang muncul.
Tabel berpartisi dan dikelompokkan
Partisi dan pengelompokan menghasilkan blok ketika semua baris dalam blok tertentu memiliki kunci partisi yang sama atau memiliki atribut pengelompokan dengan nilai yang mendekati. Oleh karena itu, kumpulan sampel dari tabel ini cenderung lebih bias dibandingkan kumpulan sampel dari tabel non-dikelompokkan dan non-berpartisi.
Batasan
- Tabel yang dijadikan sampel hanya dapat muncul sekali dalam pernyataan kueri. Batasan ini mencakup tabel yang direferensikan di dalam definisi tampilan.
- Pengambilan sampel data dari tampilan tidak didukung.
- Pengambilan sampel hasil subkueri atau panggilan fungsi bernilai tabel tidak didukung.
- Pengambilan sampel dari pemindaian array, seperti hasil pemanggilan operator
UNNEST
, tidak didukung. - Pengambilan sampel di dalam subkueri
IN
tidak didukung. - Pengambilan sampel dari tabel dengan keamanan tingkat baris tidak didukung.
Harga pengambilan sampel tabel
Jika menggunakan penagihan sesuai permintaan, Anda
akan dikenai biaya untuk membaca data yang diambil sampelnya. BigQuery tidakt
menyimpan hasil kueri yang menyertakan klausa TABLESAMPLE
ke dalam cache sehingga setiap
eksekusi akan dikenai biaya pembacaan data dari penyimpanan.