hive 抽样统计

用hive实现了随机抽样中简单随机、系统和分层抽样的方式,记得抽样的概念还是初中数据接触的 其实很多时候不需要理论,想也是可以想到的,不过还是总结一下 


   0.测试表: 
  
Sql代码   收藏代码
  1. drop table songpo_test;  
  2. create table if not exists songpo_test  
  3.  (  
  4.    refund_id string,  
  5.    user_id string,  
  6.    cat_id  string,  
  7.    cat2_id  string,  
  8.    org_id  string,  
  9.    gmt_create string  
  10.  )  
  11.  partitioned by(pt string)  
  12.  row format delimited  
  13.  fields terminated by ','  
  14.  lines terminated by '\n' STORED AS SEQUENCEFILE;  


   1. 简单随机抽样 (rand()) 从表中,随机打标,排序,随机抽取100个用户数据 
        步骤 1). 给每行记录一个相同的标记 
             2). 排序,取前100 
       
Sql代码   收藏代码
  1. sql:  
  2. select *  
  3. from(  
  4.     select user_id,flag from (select user_id,'1' as flag from songpo_test) x  
  5.     distribute by user_id sort by user_id,flag desc  
  6.     )a  
  7. where row_number(user_id)<=100;  



   2.系统抽样 mod,rand() 依照userrid取模,分5组,每组随机抽取100个用户,实现如: 
                1). 依据user_id,取模,获取 mod_numd 
                2). 在mod_num组内然后随机排序, 
                3). 从各组取出20条 

    
Sql代码   收藏代码
  1.  sql:  
  2.  select *  
  3.   from(  
  4.       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)   
  5.       distribute by mod_num sort by mod_num,rank_num desc  
  6.       )a  
  7. where row_number(mod_num)<=20;  

  
  3.分层抽样   按照每个组的记录数来分层抽样。假设需要抽取EXTRA_NUM条记录 
                1). 计算每个分区需要抽记录条数 
                2). 在mod_num组内然后随机排序, 
                3). 从各组取出cat_extra_num条  
          
Sql代码   收藏代码
  1.       drop table test_data_extra_indexs;  
  2.       create table test_data_extra_indexs as  
  3.       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   
  4.       (select cat_id,count(1) as cat_num,'1' as key from songpo_test group by cat_id) a   
  5.       join  
  6.       (select '1' as key,count(1) as all_num from songpo_test) b   
  7.       on a.key=b.key  
  8.       join  
  9.       (select * from songpo_test) c   
  10.       on a.cat_id=c.cat_id;  
  11.   
  12.   
  13.       select *  
  14.       from(  
  15.         select refund_id,user_id,cat_id,mod_num,rank_num from   
  16.         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(  
  17.         (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  
  18.         )  
  19.         distribute by mod_num sort by mod_num,rank_num desc  
  20.       )a  
  21. where row_number(mod_num)<=20;  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值