Hive 표본 추출 통계

3511 단어 sql알고리즘hadoop
본문http://www.taobaotesting.com/blogs/2468원문의 층 을 나 누 어 표본 을 추출 하 는 논리 가 명확 하지 않 고 자신의 생각 대로 다시 실현 한다.
알고리즘 에서 표본 추출 이 필요 할 수 있 습 니 다.Hive 로 무 작위 표본 추출 에서 간단 한 무 작위, 시스템 과 층 별 표본 추출 방식 을 실 현 했 는데 표본 추출의 개념 은 중학교 데이터 접촉 이라는 것 을 기억한다
사실 이론 이 필요 없 을 때 가 많 고, 생각해 도 생각 할 수 있 지만, 그래도 총괄 해 보 자.
   0. 테스트 표:
  

   drop table songpo_test;
   create table if not exists songpo_test
    (
      refund_id string,
      user_id string,
      cat_id  string,
      cat2_id  string,
      org_id  string,
      gmt_create string
    )
    partitioned by(pt string)
    row format delimited
    fields terminated by ','
    lines terminated by '
' STORED AS SEQUENCEFILE;

   1. 간단 한 무 작위 표본 추출 (rand () 은 표 에서 무 작위 로 표 시 를 하고 정렬 하 며 100 개의 사용자 데 이 터 를 무 작위 로 추출 합 니 다.
        단계 1). 줄 마다 같은 표 시 를 기록 합 니 다.
             2). 정렬, 100 위 권
       

        sql:
        select *
        from(
            select user_id,flag from (select user_id,'1' as flag from songpo_test) x
            distribute by user_id sort by user_id,flag desc
            )a
        where row_number(user_id)<=100;

   2. 시스템 샘플링 mod, rand () 는 userrid 에 따라 모델 을 추출 하고 5 조로 나 누 어 각 조 에서 100 명의 사용 자 를 무 작위 로 추출 하여 다음 과 같이 실현 한다.
                1). userid, 모형 추출, mod 획득numd
                2). mod 에서num 그룹 에서 무 작위 정렬,
                3). 각 조 에서 20 개 를 꺼낸다
    
 
       sql:
       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;

 
  3. 분 층 표본 추출   각 그룹의 기록 수 에 따라 층 을 나 누 어 표본 을 추출 하 다.만약 추출 이 필요 하 다 면 EXTRANUM 게이지 레코드
                1). 각 구역 을 계산 할 때 기록 항목 의 수 를 뽑 아야 한다.
                2). mod 에서num 그룹 에서 무 작위 정렬,
                3). 각 그룹 에서 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;

좋은 웹페이지 즐겨찾기