hive 隨機抽樣

2021-09-02 13:28:27 字數 1780 閱讀 3393

1. random sampling

--syntax:

select * from distribute by rand() sort by rand()  limit ;

2. bucket table sampling

該方式是最佳化取樣bucket表。rand()函式也可以用來取樣整行。

如果取樣列同時使用了clustered by,使用tablesample語句會更有效率。

--syntax:

select * from tablesample(bucket out of on [colname|rand()]) table_alias;

1) 使用下面的語句,從表lxw111中取樣50%的資料,建立乙個新錶:

create table lxw1234 as

select * from lxw1 tablesample (50 percent);

2)這種方式指定取樣資料的大小,單位為m。比如,下面的語句:

select * from lxw1 tablesample (30m);

3)這種方式可以根據行數來取樣,但要特別注意:這裡指定的行數,是在每個inputsplit中取樣的行數,也就是,每個map中都取樣n rows。

select * from lxw1 tablesample (200 rows)

4)

table_sample: tablesample (bucket x out of y [on colname])

如果基於乙個已經分桶表進行取樣,將會更有效率。

執行下面的語句,建立乙個分桶表,並插入資料:

create table lxw1_bucketed (pcid string)

clustered by(pcid) into 10 buckets;

insert overwrite table lxw1_bucketed

select pcid from lxw1;

表lxw1_bucketed按照pcid欄位分成10個桶,下面的語句表示從10個桶中抽樣第乙個桶的資料:

select count(1) from lxw1_bucketed tablesample(bucket 1 out of 10on pcid);

很好理解。

再看這個:

select count(1) from lxw1_bucketed tablesample(bucket 1 out of 20on pcid)

表只有10個桶,如果指定20,看結果:

結果差不多是源表記錄的1/20,hive在執行時候,會在第乙個桶中抽樣一半的資料。

還有一點:

如果從源表中直接分桶抽樣,也能達到一樣的效果,比如:

select count(1) from lxw1 tablesample(bucket 1 out of 20 on pcid);

區別在於基於已經分桶的表抽樣,查詢只會掃瞄相應桶中的資料,而基於未分桶表的抽樣,查詢時候需要掃瞄整表資料,先分桶,再抽樣。

使用Hive隨機抽樣

test1 簡單隨機抽樣 select t.varx,t.a from select varx,rand a from tablename t where t.a between 0 and 0.2這樣就抽取了五分之一的資料。或者像這樣隨機抽取100條資料,與limit結合使用 select dis...

Hive實現隨機抽樣(附詳解)

select from tab order by rand limit 1000select from select e.cast rand 100000 as int as idx from e t order by t.idx limit 1000表e為乙個存有資料普通表,我們要從表e中隨機抽出...

mR 隨機抽樣

1.問題由來 google曾經有一道非常經典的面試題 給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 這道題的解法非常多,網上討論也非常熱烈。本文要討論的是...