Hive學習之抽樣(tablesample)

2021-08-14 07:31:07 字數 2186 閱讀 9303

當資料量特別大時,對全體資料進行處理存在困難時,抽樣就顯得尤其重要了。抽樣可以從被抽取的資料中估計和推斷出整體的特性,是科學實驗、質量檢驗、社會調查普遍採用的一種經濟有效的工作和研究方法。

hive支援桶表抽樣和塊抽樣,下面分別學習。所謂桶表指的是在建立表時使用clustered by子句建立了桶的表。桶表抽樣的語法如下:

table_sample: tablesample (bucket x out

of y [on colname])

tablesample子句允許使用者編寫用於資料抽樣而不是整個表的查詢,該子句出現from子句中,可用於任何表中。桶編號從1開始,colname表明抽取樣本的列,可以是非分割槽列中的任意一列,或者使用rand()表明在整個行中抽取樣本而不是單個列。在colname上分桶的行隨機進入1到y個桶中,返回屬於桶x的行。下面的例子中,返回32個桶中的第3個桶中的行:

[sql] view plain copy

select *  

from source tablesample(bucket 3 out of

32on rand()) s;

通常情況下,tablesample將會掃瞄整個表然後抽取樣本,顯然這種做法效率不是很高。替代方法是,由於在使用clustered by時指定了分桶的列,如果抽樣時tablesample子句中指定的列匹配clustered by子句中的列,tablesample只掃瞄表中要求的分割槽。假如上面的例子中,source表在建立時使用了clusteredby id into 32 buckets,那麼下面的語句將返回第3個和第19個簇中的行,因為每個桶由(32/16)=2個簇組成。為什麼是3和19呢,因為要返回的是第3個桶,而每個桶由原來的2個簇組成,第3個桶就由原來的第3個和19個簇組成,根據簡單的雜湊演算法(3%16=19%16)。

tablesample(bucket 3

outof

16on id)

相反,下面的語句將會返回第3個簇的一半,因為每個桶由(32/64)=1/2個簇組成。

tablesample(bucket 3

outof

64on id)

從hive-0.8開始可以使用塊抽樣,語法為:

block_sample: tablesample (n percent)
該語句允許抽取資料大小的至少n%(不是行數,而是資料大小)做為輸入,支援combinehiveinputformat而一些特殊的壓縮格式是不能夠被處理的,如果抽樣失敗,mapreduce作業的輸入將是整個表。由於在hdfs塊層級進行抽樣,所以抽樣粒度為塊的大小,例如如果塊大小為256mb,即使輸入的n%僅為100mb,也會得到256mb的資料。下面的例子中輸入的0.1%或更多將用於查詢:

select *  

rom source tablesample(0.1 percent) s;

如果希望在不同的塊中抽取相同的資料,可以改變下面的引數:

set hive.sample.seednumber=;
也可以指定讀取資料的長度,該方法與percent抽樣具有一樣的限制,為什麼有相同的限制,是因為該語法僅將百分比改為了具體值,但沒有改變基於塊抽樣這一前提條件。該語法為:

block_sample: tablesample (bytelengthliteral)  

bytelengthliteral : (digit)+ ('b' | 'b' | 'k' | 'k' | 'm' | 'm' | 'g' | 'g')

select *  

from source tablesample(100m) s;

hive也支援基於行數的輸入限制,當效果與上面介紹的兩個不同。首先不需要combinehiveinputformat,這意味著可以被用在非原生表中。其次行數被用在每個split中。因此總的行數根據輸入的split數而變化很大。語法格式為:

block_sample: tablesample (n rows)
例如下面的查詢將從每個split中抽取10行:

select * from source tablesample(10

rows);

Hive學習之抽樣(tablesample)

當資料量特別大時,對全體資料進行處理存在困難時,抽樣就顯得尤其重要了。抽樣可以從被抽取的資料中估計和推斷出整體的特性,是科學實驗 質量檢驗 社會調查普遍採用的一種經濟有效的工作和研究方法。hive支援桶表抽樣和塊抽樣,下面分別學習。所謂桶表指的是在建立表時使用clustered by子句建立了桶的表...

hive 隨機抽樣

1.random sampling syntax select from distribute by rand sort by rand limit 2.bucket table sampling 該方式是最佳化取樣bucket表。rand 函式也可以用來取樣整行。如果取樣列同時使用了cluster...

HIve實現資料抽樣

1,2,在大規模資料量的資料分析及建模任務中,往往針對全量資料進行挖掘分析時會十分耗時和占用集群資源,因此一般情況下只需要抽取一小部分資料進行分析及建模操作。hive提供了資料取樣 sampling 的功能,能夠根據一定的規則進行資料抽樣,目前支援資料塊抽樣,分桶抽樣和隨機抽樣,具體如下所示 分桶抽...