官網中假設建立表時設置了 CLUSTERED BY(id) INTO 32 BUCKETS
即分紅了32個文件(雖然這裏用的是bucket,爲了不混淆和方便理解下面的解釋,我的傾向於用cluster或者叫簇來代替),那麼下面這個子句apache
TABLESAMPLE(BUCKET 3 OUT OF 16 ON id)
在查詢中的意思是將cluster分紅16個桶,而後取出第三個桶中的數據。32個文件分進16個桶,那就是每一個桶有(32/16=)2 個cluster,怎麼分呢?第1個cluster分進第1個桶,第2個cluster分進第2個桶......第16個cluster分進第16個桶,第17個cluster分進第1個桶,以此類推。因此當取出第三個桶中的數據時,就會取出第3個簇(cluster)和第19簇(cluster)的數據。官網原話:code
would pick out the 3rd and 19th clusters as each bucket would be composed of (32/16)=2 clusters.blog
那下面這個怎麼理解呢?教程
TABLESAMPLE(BUCKET 3 OUT OF 64 ON id)
32個cluster分進64個桶,而後再抽出第三個桶中的數據。32/64=1/2,每一個桶由1/2個cluster組成,一樣地,第1個cluster的前一半數據分進第1個桶,後一半數據分進第33個桶,第2個cluster的前一半數據分進第2個桶,後一半數據分進第34個桶,.....第32個cluster的前一半數據分進第32個桶,後一半數據分進第64個桶。因此這個子句會取出第3個桶中的數據,也就是第3個cluster中的前一半數據。官網原話:get
would pick out half of the 3rd cluster as each bucket would be composed of (32/64)=1/2 of a cluster.table
補充官網關於分桶表的DDL操做sed