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.