All Products
Search
Document Center

MaxCompute:TABLESAMPLE

Last Updated:Jul 02, 2025

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_name atau rand() harus digunakan. Jika fungsi rand() digunakan, data masukan dibagi ke dalam bucket secara acak. Anda dapat menentukan maksimal 10 kolom dalam klausa ON.

  • Pengambilan sampel berbasis persentase

    TABLESAMPLE (<n> PERCENT)

    Dalam sintaksis ini, n menentukan 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 sekitar n%. Nilai persentase tidak sepenuhnya akurat.

  • Pengambilan sampel acak

    TABLESAMPLE (<m> ROWS)

    m menentukan jumlah rekaman yang dikembalikan. Jika jumlah total rekaman dalam tabel sumber kurang dari nilai m, semua rekaman dalam tabel sumber akan dikembalikan. Nilai maksimum m adalah 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_2020 merupakan bagian dari dataset publik MaxCompute. Untuk informasi lebih lanjut tentang dataset publik, lihat Ikhtisar.

  • tblsample_test

    Tabel tblsample_test adalah 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|
    +------------+---+
    Catatan

    Data dalam tabel terkluster disimpan dalam bucket. Oleh karena itu, data langsung diambil dari bucket selama pengambilan sampel, meningkatkan kinerja pengambilan sampel. Tabel tblsample_test dibagi menjadi 32 bucket saat tabel dibuat. Kinerja pengambilan sampel dapat ditingkatkan jika nilai y merupakan kelipatan dari 32, seperti 32, 64, atau 128, atau jika 32 habis dibagi oleh nilai y, seperti 16, 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 sekitar n%. 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 n rekaman dari tabel tblsample_test.

    select * FROM tblsample_test TABLESAMPLE (2 ROWS);
    
    -- Hasil berikut dikembalikan:
    +------------+---+---+
    | a          | b | c |
    +------------+---+---+
    | 2          | b2 | c2 |
    | 3          | b3 | c3 |
    +------------+---+---+