1 在hive中使用rand簡(jiǎn)單隨機(jī)抽樣
select a.*,rand(12345) as random
from tripdata a;
country city visitors random
阿聯(lián)酋 阿布扎比 137 0.3618031071604718
阿聯(lián)酋 阿布扎比 146 0.932993485288541
阿聯(lián)酋 阿布扎比 178 0.8330913489710237
阿聯(lián)酋 阿布扎比 337 0.32647575623792624
阿聯(lián)酋 阿布扎比 178 0.2355237906476252
阿聯(lián)酋 阿布扎比 227 0.34911535662488336
阿聯(lián)酋 阿布扎比 157 0.4480776326931518
阿聯(lián)酋 迪拜 144 0.6381529437838686
阿聯(lián)酋 迪拜 268 0.1582665432952023
阿聯(lián)酋 迪拜 103 0.768888060192009
阿聯(lián)酋 迪拜 141 0.9450734577298074
阿聯(lián)酋 迪拜 108 0.06558504072066074
阿聯(lián)酋 迪拜 266 0.8102312734654696
澳大利亞 悉尼 141 0.47791537253375116
澳大利亞 悉尼 122 0.3325863969722369
澳大利亞 悉尼 153 0.6925313420371904
澳大利亞 悉尼 128 0.9162288670686813
澳大利亞 墨爾本 294 0.35086223384270854
澳大利亞 墨爾本 230 0.09024327831371282
澳大利亞 墨爾本 159 0.5554002739128288
澳大利亞 墨爾本 188 0.10277490055301586
澳大利亞 堪培拉 249 0.9443583363476495
澳大利亞 堪培拉 378 0.19418323997969733
澳大利亞 堪培拉 255 0.2535159880591803
澳大利亞 堪培拉 240 0.6960683253803703
select a.*
from (
select a.*,rand(12345) as random
from tripdata a
) a
where random between 0 and 0.2;
a.country a.city a.visitors a.random
阿聯(lián)酋 迪拜 268 0.3618031071604718
阿聯(lián)酋 迪拜 108 0.932993485288541
澳大利亞 墨爾本 230 0.8330913489710237
澳大利亞 墨爾本 188 0.32647575623792624
澳大利亞 堪培拉 378 0.2355237906476252
select distinct a.*
from tripdata a
order by rand(12345)
limit 5;
country city visitors
阿聯(lián)酋 阿布扎比 157
阿聯(lián)酋 阿布扎比 137
阿聯(lián)酋 迪拜 144
阿聯(lián)酋 阿布扎比 227
澳大利亞 堪培拉 240
2、數(shù)據(jù)塊取樣(Block Sampling)--來(lái)源于網(wǎng)路
--數(shù)據(jù)塊取樣(Block Sampling)
SELECT * FROM lxw1 TABLESAMPLE (50 PERCENT);
--將會(huì)從表lxw1中取樣30M的數(shù)據(jù):
SELECT * FROM lxw1 TABLESAMPLE (30M);
--這種方式可以根據(jù)行數(shù)來(lái)取樣和橙,但要特別注意:
這里指定的行數(shù),是在每個(gè)InputSplit中取樣的行數(shù)裂垦,也就是,每個(gè)Map中都取樣n ROWS肌索。
SELECT COUNT(1) FROM (SELECT * FROM lxw1 TABLESAMPLE (200 ROWS)) x;
--分桶表取樣(Sampling Bucketized Table)
SELECT COUNT(1)
FROM lxw1 TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());
系統(tǒng)抽樣 --來(lái)源于網(wǎng)路
mod,rand() 依照userrid取模蕉拢,分5組,每組隨機(jī)抽取100個(gè)用戶诚亚,實(shí)現(xiàn)如:
- 依據(jù)user_id晕换,取模,獲取 mod_numd
- 在mod_num組內(nèi)然后隨機(jī)排序站宗,
- 從各組取出20條
select *
from(
select refund_id,user_id,mod_num,rank_num from
(select refund_id,user_id,cast(10+rand()*100 as double) rank_num,
user_id%5 as mod_num
from songpo_test)
distribute by mod_num sort by mod_num,rank_num desc
) a
where row_number(mod_num)<=20;
分層抽樣 --來(lái)源于網(wǎng)路
按照每個(gè)組的記錄數(shù)來(lái)分層抽樣闸准。假設(shè)需要抽取EXTRA_NUM條記錄
- 計(jì)算每個(gè)分區(qū)需要抽記錄條數(shù)
- 在mod_num組內(nèi)然后隨機(jī)排序
- 從各組取出cat_extra_num條
drop table test_data_extra_indexs;
create table test_data_extra_indexs as
select a.cat_id,cat_num,all_num,cat_num/all_num as extra_lv,(cat_num/all_num)*'EXTRA_NUM' as cat_extra_num,c.refund_id,c.user_id,c.org_id from
(select cat_id,count(1) as cat_num,'1' as key from songpo_test group by cat_id) a
join
(select '1' as key,count(1) as all_num from songpo_test) b
on a.key=b.key
join
(select * from songpo_test) c
on a.cat_id=c.cat_id;
select *
from(
select refund_id,user_id,cat_id,mod_num,rank_num from
select refund_id,user_id,cat_id,cast(10+rand()*100 as double) rank_num,user_id%5 as mod_num,cat_extra_num from(
(select refund_id,user_id,cat_id,cast(10+rand()*100 as double) rank_num,user_id%5 as mod_num from test_data_extra_indexs) x
)
distribute by mod_num sort by mod_num,rank_num desc
)a
where row_number(mod_num)<=20;