MaxCompute支持通過TABLESAMPLE功能來對表數據進行采樣,包含三種采樣方式:分桶采樣、指定采樣百分比采樣和隨機返回指定記錄數采樣。本文為您介紹使用TABLESAMPLE采樣的命令語法和使用示例。
命令格式
分桶采樣。
TABLESAMPLE (BUCKET <x> OUT OF <y> [ON <col_name> | rand()])
參數說明如下。
x,y:必填。將源表中的數據劃分為y個桶,取其中的第x個桶,桶從1開始編號。
col_name:分桶列名即要進行采樣的列名。當表不是聚簇表時,
col_name
與rand()
函數必須二選一,當使用rand()
函數時表示對輸入的數據隨機進行分桶。ON
語句中最多支持指定10個列。
指定采樣百分比采樣。
TABLESAMPLE (<n> PERCENT)
其中
n
為采樣百分比,取其中n%
的數據,即采樣返回的數據記錄個數和源表中總記錄個數之比大概是n%
,非精確值。隨機返回指定記錄數采樣。
TABLESAMPLE (<m> ROWS)
其中
m
為指定隨機返回的記錄數。如果源表中的總記錄個數小于m
,則返回源表中的全部記錄。m
最大值為10000。
示例數據
本文使用示例需要用到如下兩個表。
BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020。
BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020
表是MaxCompute公開數據集中的表,詳情請參見公開數據集概述。tblsample_test。
tblsample_test
表為聚簇表,建表DDL及數據插入命令如下。--創建cluster表 CREATE TABLE tblsample_test(a bigint, b string, c string) CLUSTERED BY (a, c) SORTED by (a, c) INTO 32 BUCKETS; --插入數據 insert overwrite table tblsample_test values(1,"b1","c1"), (2,"b2","c2"), (3,"b3","c3"), (4,"b4","c4"); --查詢表數據 select * from tblsample_test; --返回結果 +------------+---+-----+ | a | b | c | +------------+---+-----+ | 2 | b2 | c2 | | 4 | b4 | c4 | | 3 | b3 | c3 | | 1 | b1 | c1 | +------------+---+---+
使用示例
示例1:根據列的值分桶進行采樣。
--對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; --返回結果 +----------+---------+----------+ | isp_code | phoneno | province | +----------+---------+----------+ | 185 | 1853500 | 山西 | | 187 | 1878332 | 四川 | +----------+---------+----------+
示例2:使用
RAND()
函數,對輸入的數據隨機分桶進行采樣。--對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; --返回結果 +----------+---------+----------+ | isp_code | phoneno | province | +----------+---------+----------+ | 131 | 1312224 | 上海 | | 135 | 1353936 | 廣東 | | 158 | 1586377 | 山東 | +----------+---------+----------+
示例3:對聚簇表tblsample_test可省略
ON
條件進行采樣。select a, b from tblsample_test TABLESAMPLE (BUCKET 1 OUT OF 2) as ts; --返回結果 +------------+---+ | a | b | +------------+---+ | 2 | b2| +------------+---+
說明因為聚簇表中的數據在存儲的時候已經分桶存儲,因此在采樣的時候會直接從某個桶里取數據,這樣做可以提高采樣的性能。
tblsample_test
表在創建的時候是分了32個桶,采樣的時候,只要總桶數y
的取值為32的倍數(32/64/128...
)或者是能整除32(16/8/4/...
),都可以取得性能優化的效果。示例4:對tblsample_test表進行采樣,取其中
n%
的數據,即采樣返回的數據記錄個數和源表中總記錄個數之比大概是n%
(不能保證絕對精確)。--取tblsample_test 50%的數據 SELECT * FROM tblsample_test TABLESAMPLE (50 PERCENT) s; --返回結果 +------------+---+---+ | a | b | c | +------------+---+---+ | 2 | b2 | c2 | | 3 | b3 | c3 | +------------+---+---+
示例5:對tblsample_test表進行采樣,隨機返回
n
條記錄。select * FROM tblsample_test TABLESAMPLE (2 ROWS); --返回結果 +------------+---+---+ | a | b | c | +------------+---+---+ | 2 | b2 | c2 | | 3 | b3 | c3 | +------------+---+---+