Hive 의 전형 적 인 응용 장면
수요: 현재 이러한 데 이 터 를 가지 고 있 습 니 다. 모든 사용자 가 매달 까지 의 최대 한 달 방문 횟수 와 이 달 까지 의 총 방문 횟수 를 누적 해 야 합 니 다.데이터:
, ,
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
spark 의 2: 원리 소개Google Map/Reduce 를 바탕 으로 이 루어 진 Hadoop 은 개발 자 에 게 map, reduce 원 어 를 제공 하여 병렬 일괄 처리 프로그램 을 매우 간단 하고 아름 답 게 만 들 었 습 니 다.S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.