Hive 의 전형 적 인 응용 장면

사례 1:
수요: 현재 이러한 데 이 터 를 가지 고 있 습 니 다. 모든 사용자 가 매달 까지 의 최대 한 달 방문 횟수 와 이 달 까지 의 총 방문 횟수 를 누적 해 야 합 니 다.데이터:
   ,  ,    
A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
A,2015-02,4
A,2015-02,6
B,2015-02,10
B,2015-02,5
A,2015-03,16
A,2015-03,22
B,2015-03,23
B,2015-03,10
B,2015-03,11

최종 결과:
                                      
A     2015-01          33              33               33
A     2015-02          33              43               10
A     2015-03          38              81               38
B     2015-01          30              30               30
B     2015-02          30              45               15
B     2015-03          44              89                44

해결:
#step01               
create view view_step01 as select name,month,sum(visitCount) total from t_user  group by name,month;
#step02 (   ,     name)
create view view_step02 as
    select t1.name aname,t1.month amonth,t1.total atotal,t2.name bname,t2.month bmonth,t2.total btotal
    from view_step01 t1 join view_step01  t2 on t1.name =t2.name 
#step03       ,               
select bname,bmonth,max(btotal),sum(btotal),btotal
from view_step02
where unix_timestamp(amonth,'yyyy-MM')>=unix_timestamp(bmoth,'yyyy-MM')
group by aname,amonth,atotal;

사례 2:
\ # 표 작성 문:
CREATE TABLE `course` (
  `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `sid` int(11) DEFAULT NULL,
  `course` varchar(255) DEFAULT NULL,
  `score` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#    
INSERT INTO `course` VALUES (1, 1, 'yuwen', 43);
INSERT INTO `course` VALUES (2, 1, 'shuxue', 55);
INSERT INTO `course` VALUES (3, 2, 'yuwen', 77);
INSERT INTO `course` VALUES (4, 2, 'shuxue', 88);
INSERT INTO `course` VALUES (5, 3, 'yuwen', 98);
INSERT INTO `course` VALUES (6, 3, 'shuxue', 65);

수요: 모든 수학 과정 성적 이 국어 과정 성적 보다 큰 학생 의 학 번 해결: (행렬 전환)
SELECT
    t1.sid 
FROM
    (
SELECT
    sid,
    max( CASE `course` WHEN "yuwen" THEN score ELSE 0 END ) AS "yuwen",
    max( CASE `course` WHEN "shuxue" THEN score ELSE 0 END ) AS "shuxue" 
FROM
    `course` 
GROUP BY
    sid 
    ) t1 
WHERE
    t1.yuwen < t1.shuxue;

사례 3:
수요: 예 를 들 어 2010 012325 는 2010 년 01 월 23 일 기온 이 25 도 라 고 밝 혔 다.현재 hive 를 사용 하여 매년 나타 나 는 최대 기온 의 날짜 + 온 도 를 계산 해 야 합 니 다.데이터: 년 온도 20140101 1420140102 1620140103 1720140104 1020140105 0620120106 092012012010 08 1220120109 192011011010 2320010101 1620010102 1220010103 1020010104 1120010104 1120010105 2920130106 1920130107 2220130108 1220130109 2920130110 2320080101 05
지금 은 연월 에 따라 group by 를 진행 해 야 하지만 최종 결 과 는 200801101 05 가 필요 합 니 다. 즉, 그룹 필드 와 마지막 에 남 겨 진 필드 가 다 르 면 어떻게 합 니까?
해결:
#Step1:
CREATE VIEW view_step1 AS SELECT
substr( tmp, 1, 4 ) AS YEAR,
max( substr( tmp, 9, 2 ) ) AS tmp 
FROM
    tmp 
GROUP BY
    substr( tmp, 1, 4 );

#Step2:
SELECT
    b.tmp,
    a.tmp 
FROM
    view_step1 a
    JOIN tmp b ON a.YEAR = substr( b.tmp, 1, 4 ) 
    AND a.tmp = substr( b.tmp, 9, 2 );

사례 4:
데이터
#   id 1,2,3        a,b,c,d,e,f     :
id course 
1,a 
1,b 
1,c 
1,e 
2,a 
2,c 
2,d 
2,f 
3,a 
3,b 
3,c 
3,e

필요: Hive 의 HQL 문 구 를 작성 하여 다음 과 같은 결 과 를 실현 합 니 다. 표 의 1 은 선택 과목 을 표시 하고 표 의 0 은 선택 과목 을 표시 하지 않 습 니 다.해결 (방안 1):
#    
select id 
max(case when course='a' then 1 else 0 and ) as a ,
max(case when course='b' then 1 else 0 and ) as b ,
max(case when course='c' then 1 else 0 and ) as c ,
max(case when course='d' then 1 else 0 and ) as d ,
max(case when course='e' then 1 else 0 and ) as e ,
max(case when course='f' then 1 else 0 and ) as f
from course  group by id;

해결 (방안 2):
#collect_set  
#step01
create view id_courses as 
select a.course acourse,b.course bcourse,b.id id
(select collect_set(course) as course from course) a 
    join 
(selecet id ,colect_set(course) as course from course group by id) b

#step02
select id,
case when array_contains(bcourse,acourse[0]) then 1 else 0 end as a ,
case when array_contains(bcourse,acourse[1]) then 1 else 0 end as b ,
case when array_contains(bcourse,acourse[2]) then 1 else 0 end as c ,
case when array_contains(bcourse,acourse[3]) then 1 else 0 end as d ,
case when array_contains(bcourse,acourse[4]) then 1 else 0 end as e ,
case when array_contains(bcourse,acourse[5]) then 1 else 0 end as f
from id_courses;

다음으로 전송:https://blog.51cto.com/14048416/2342604

좋은 웹페이지 즐겨찾기