Anda dapat menggunakan fitur TABLESAMPLE yang disediakan oleh MaxCompute untuk melakukan pengambilan sampel data tabel. Fitur ini mencakup tiga metode: pengambilan sampel berbasis bucket, pengambilan sampel berbasis persentase, dan pengambilan sampel acak. Pengambilan sampel berbasis persentase mengembalikan rekaman berdasarkan persentase tertentu, sedangkan pengambilan sampel acak mengembalikan sejumlah rekaman acak yang ditentukan. Topik ini menjelaskan sintaksis TABLESAMPLE serta memberikan contoh penggunaannya.
Sintaksis
Pengambilan sampel berbasis bucket
TABLESAMPLE (BUCKET <x> OUT OF <y> [ON <col_name> | rand()])Deskripsi parameter:
x dan y: wajib. Data dalam tabel sumber dibagi menjadi y bucket bernomor mulai dari 1. Data di bucket ke-x akan diambil sampelnya.
col_name: nama kolom yang ingin Anda ambil sampelnya. Jika tabel bukan tabel terkluster, fungsi
col_nameataurand()harus digunakan. Jika fungsirand()digunakan, data masukan dibagi ke dalam bucket secara acak. Anda dapat menentukan maksimal 10 kolom dalam klausaON.
Pengambilan sampel berbasis persentase
TABLESAMPLE (<n> PERCENT)Dalam sintaksis ini,
nmenentukan nilai persentase pengambilan sampel. Saat menggunakan pengambilan sampel berbasis persentase,n%data akan diambil sampelnya. Persentase rekaman yang dikembalikan terhadap semua rekaman dalam tabel sumber adalah sekitarn%. Nilai persentase tidak sepenuhnya akurat.Pengambilan sampel acak
TABLESAMPLE (<m> ROWS)mmenentukan jumlah rekaman yang dikembalikan. Jika jumlah total rekaman dalam tabel sumber kurang dari nilaim, semua rekaman dalam tabel sumber akan dikembalikan. Nilai maksimummadalah 10000.
Data sampel
Tabel sampel berikut digunakan:
BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020
Tabel
BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020merupakan bagian dari dataset publik MaxCompute. Untuk informasi lebih lanjut tentang dataset publik, lihat Ikhtisar.tblsample_test
Tabel
tblsample_testadalah tabel terkluster. Pernyataan CREATE TABLE dan INSERT OVERWRITE berikut digunakan untuk membuat tabel dan memasukkan data ke dalam tabel.-- Buat tabel tblsample_test. CREATE TABLE tblsample_test(a bigint, b string, c string) CLUSTERED BY (a, c) SORTED by (a, c) INTO 32 BUCKETS; -- Masukkan data ke dalam tabel. insert overwrite table tblsample_test values(1,"b1","c1"), (2,"b2","c2"), (3,"b3","c3"), (4,"b4","c4"); -- Query data dari tabel. select * from tblsample_test; -- Hasil berikut dikembalikan: +------------+---+-----+ | a | b | c | +------------+---+-----+ | 2 | b2 | c2 | | 4 | b4 | c4 | | 3 | b3 | c3 | | 1 | b1 | c1 | +------------+---+---+
Contoh
Contoh 1: Bagi data masukan ke dalam bucket berdasarkan nilai kolom dan ambil sampel data dari bucket tertentu.
-- Ambil sampel data dari tabel BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020. SELECT isp_code, phoneno, province FROM BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020 TABLESAMPLE (BUCKET 1 OUT of 1000000 ON isp_code, phoneno, province) s; -- Hasil berikut dikembalikan: +----------+---------+----------+ | isp_code | phoneno | province | +----------+---------+----------+ | 185 | 1853500 | Shanxi | | 187 | 1878332 | Sichuan | +----------+---------+----------+Contoh 2: Gunakan fungsi
RAND()untuk membagi data masukan ke dalam bucket secara acak dan ambil sampel data dari bucket tertentu.-- Ambil sampel data dari tabel BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020. SELECT isp_code, phoneno, province FROM BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020 TABLESAMPLE (BUCKET 3 OUT OF 500000 ON RAND()) s; -- Hasil berikut dikembalikan: +----------+---------+----------+ | isp_code | phoneno | province | +----------+---------+----------+ | 131 | 1312224 | Shanghai | | 135 | 1353936 | Guangdong | | 158 | 1586377 | Shandong | +----------+---------+----------+Contoh 3: Ambil sampel data dari tabel tblsample_test tanpa menentukan klausa
ON.select a, b from tblsample_test TABLESAMPLE (BUCKET 1 OUT OF 2) as ts; -- Hasil berikut dikembalikan: +------------+---+ | a | b | +------------+---+ | 2 | b2| +------------+---+CatatanData dalam tabel terkluster disimpan dalam bucket. Oleh karena itu, data langsung diambil dari bucket selama pengambilan sampel, meningkatkan kinerja pengambilan sampel. Tabel
tblsample_testdibagi menjadi 32 bucket saat tabel dibuat. Kinerja pengambilan sampel dapat ditingkatkan jika nilaiymerupakan kelipatan dari 32, seperti32, 64, atau 128, atau jika 32 habis dibagi oleh nilai y, seperti16, 8, atau 4.Contoh 4: Ambil sampel
n%data dari tabel tblsample_test. Dalam contoh ini, persentase rekaman sampel terhadap semua rekaman dalam tabel sumber adalah sekitarn%. Nilai persentase tidak sepenuhnya akurat.-- Ambil sampel 50% data dari tabel tblsample_test. SELECT * FROM tblsample_test TABLESAMPLE (50 PERCENT) s; -- Hasil berikut dikembalikan: +------------+---+---+ | a | b | c | +------------+---+---+ | 2 | b2 | c2 | | 3 | b3 | c3 | +------------+---+---+Contoh 5: Ambil sampel
nrekaman dari tabel tblsample_test.select * FROM tblsample_test TABLESAMPLE (2 ROWS); -- Hasil berikut dikembalikan: +------------+---+---+ | a | b | c | +------------+---+---+ | 2 | b2 | c2 | | 3 | b3 | c3 | +------------+---+---+