Hive 창 함수 문법 상세 설명 및 안 열
36212 단어 빅 데이터 하 이브
1. 창문 을 여 는 함 수 는 언제 사용 합 니까?창 을 여 는 함 수 는 항상 집합 함수 와 결합 하여 사용 합 니 다. 일반적으로 집합 후의 줄 수 는 집합 전의 줄 수 보다 적 습 니 다. 그러나 가끔 은 집합 전의 데 이 터 를 표시 하고 싶 을 뿐만 아니 라 집합 후의 데 이 터 를 표시 하려 고 할 때 우 리 는 창 함 수 를 도입 합 니 다.
예 를 들 면:
+-------+-------------+-------+---------------+--+
| name | orderdate | cost | sum_window_0 |
+-------+-------------+-------+---------------+--+
| jack | 2017-01-01 | 10 | 205 |
| jack | 2017-01-08 | 55 | 205 |
| tony | 2017-01-07 | 50 | 205 |
| jack | 2017-01-05 | 46 | 205 |
| tony | 2017-01-04 | 29 | 205 |
| tony | 2017-01-02 | 15 | 205 |
| jack | 2017-02-03 | 23 | 23 |
| mart | 2017-04-13 | 94 | 341 |
| jack | 2017-04-06 | 42 | 341 |
| mart | 2017-04-11 | 75 | 341 |
| mart | 2017-04-09 | 68 | 341 |
| mart | 2017-04-08 | 62 | 341 |
| neil | 2017-05-10 | 12 | 12 |
| neil | 2017-06-12 | 80 | 80 |
+-------+-------------+-------+---------------+--
2. 창 함수 의 문법:
UDAF() over (PARTITION By col1,col2 order by col3 (rows between .. and ..)) AS
메모: PARTITION By 후 여러 필드 를 따라 갈 수 있 습 니 다. order By 는 한 필드 만 따라 갈 수 있 습 니 다.
3. over () 의 역할 over () 는 집합 함수 의 집합 범 위 를 결정 합 니 다. 기본적으로 전체 창의 데 이 터 를 집합 합 니 다. 집합 함 수 는 모든 데 이 터 를 한 번 씩 호출 합 니 다.
예 를 들 면:
select name, orderdate, cost, sum(cost) over()
from business;
4. partition by 자구: Partiton by 자 구 를 사용 하여 데 이 터 를 구분 하고 paritition by 로 구역 내 를 취 합 할 수 있 습 니 다.
예 를 들 면:
select name, orderdate, cost, sum(cost) over(partition by name)
from business;
5. order by 자구:
역할: (1) 파 티 션 의 데 이 터 를 정렬 합 니 다.(2) 어떤 줄 을 취 합 할 지 확인 합 니 다 (기본 값 은 출발점 에서 현재 줄 까지 의 취 합)
예 를 들 면:
select name, orderdate, cost, sum(cost) over(partition by name order by orderdate)
from business;
6. 창 자구 CURRENT ROW: 현재 행 n PRECEDING: 앞으로 n 행 데이터 n FOLLOWING: 뒤로 n 행 데이터 UNBOUNDED: 출발점, UNBOUNDED PRECEDING 은 앞의 출발점, UNBOUNDED FOLLOWING 은 뒤의 종점 을 나 타 냅 니 다.
partition by 자 구 를 사용 하여 데 이 터 를 구분 하 였 습 니 다.창 을 더 가 늘 게 동적 으로 구분 하려 면 창 자 구 를 도입 해 야 합 니 다.
예 를 들 면:
select name, orderdate,cost, sum(cost)
over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and CURRENT ROW)
from business;
7. 몇 시 주의:
(1) order by 는 partition by 를 따라 가 야 합 니 다.(2) Rows 는 Order by 자 를 따라 야 합 니 다.(3) (partition by... orderby) 를 (distribute by... sort by..) 로 바 꿀 수 있 습 니 다.
시간 형식의 변환 과 창 함수 의 종합 응용 을 보 여 줍 니 다.저 희 는 다음 과 같은 사용자 방문 데이터 가 있 습 니 다 userId visitDate visitCount u01 2017 / 1 / 21 5 u02 2017 / 1 / 23 6 u03 2017 / 1 / 22 8 u04 2017 / 1 / 20 3 u01 2017 / 1 / 23 6 u01 2017 / 2 / 21 8 U02 2017 / 1 / 23 6 U01 2017 / 2 / 22 4 SQL 을 사용 하여 모든 사용자 의 누적 방문 횟수 를 집계 하도록 요구 합 니 다.다음 표 에서 보 듯 이 사용자 id 월 소계 누적 u01 2017 - 01 11 u01 2017 - 02 12 23 u02 2017 - 01 12 12 u03 2017 - 01 8 u04 2017 - 01 3
--
create table test01_visit (
userId string COMMENT ' ID',
visitDate string COMMENT ' ',
visitCount string COMMENT ' '
) COMMENT ' 1 '
row format delimited fields terminated by '\t'
location '/warehouse/test/test01';
--
insert into table test01_visit values('u01','2017/1/21','5');
insert into table test01_visit values('u02','2017/1/23','6');
insert into table test01_visit values('u03','2017/1/22','8');
insert into table test01_visit values('u04','2017/1/20','3');
insert into table test01_visit values('u01','2017/1/23','6');
insert into table test01_visit values('u01','2017/2/21','8');
insert into table test01_visit values('U02','2017/1/23','6');
insert into table test01_visit values('U01','2017/2/22','4');
– 사용자 별 누적 방문 횟수 집계
--
select from_unixtime(unix_timestamp(visitDate,'yyyy/mm/dd'),'yyyy-mm') FROM test01_visit;
– 대소 문자 변환
select lower(userId) FROM test01_visit;
– 월 별 방문 횟수 집계
select
lower(userId) userId,
from_unixtime(unix_timestamp(visitDate,'yyyy/mm/dd'),'yyyy-mm') visitMonth,
sum(visitCount) visit_month
from test01_visit
group by lower(userId),from_unixtime(unix_timestamp(visitDate,'yyyy/mm/dd'),'yyyy-mm');
– 누적 방문 횟수 집계
select
t1.userId userId,
t1.visitMonth visitMonth,
t1.visit_month count_month,
sum(t1.visit_month) over (partition by userId order by visitMonth rows between UNBOUNDED PRECEDING AND CURRENT ROW) sum_month
from
(
select
lower(userId) userId,
from_unixtime(unix_timestamp(visitDate,'yyyy/mm/dd'),'yyyy-mm') visitMonth,
sum(visitCount) visit_month
from test01_visit
group by lower(userId),from_unixtime(unix_timestamp(visitDate,'yyyy/mm/dd'),'yyyy-mm')
) t1
안 열 2 고전 Hive 안 열 구 PV (방문 횟수) UV (방문 자 수)
– 50W 개의 경 동 점포 가 있 습 니 다. 모든 고객 이 모든 점포 의 모든 상품 을 방문 할 때 방문 로 그 를 만 듭 니 다. 방문 로그 에 저 장 된 표 이름 은 Visit 입 니 다. – 방문객 의 사용자 id 는 user 입 니 다.id, 방문 한 점포 의 이름 은 shop 입 니 다. - 1) 점포 당 UV (방문객 수) - 2) 점포 당 방문 횟수 top 3 의 방문객 정 보 를 집계 하 십시오.출력 점포 이름, 방문객 id, 방문 횟수
--
drop table if exists test02_user;
create table test02_user(
user_id string COMMENT ' id',
user_name string COMMENT ' '
)
row format delimited fields terminated by '\t'
location '/warehouse/test/test02/user';
--
drop table if exists test02_shoop;
create table test02_shoop(
shoop_id string COMMENT ' id',
shoop_name string COMMENT ' '
)
row format delimited fields terminated by '\t'
location '/warehouse/test/test02/shoop';
--
drop table if exists test02_Visit;
create table test02_Visit(
shoop_name string COMMENT ' ',
user_id string COMMENT ' id',
visit_time string COMMENT ' '
)
row format delimited fields terminated by '\t'
location '/warehouse/test/test02';
--
insert into table test02_Visit values ('huawei','1001','2017-02-10');
insert into table test02_Visit values ('icbc','1001','2017-02-10');
insert into table test02_Visit values ('huawei','1001','2017-02-10');
insert into table test02_Visit values ('apple','1001','2017-02-10');
insert into table test02_Visit values ('huawei','1001','2017-02-10');
insert into table test02_Visit values ('huawei','1002','2017-02-10');
insert into table test02_Visit values ('huawei','1002','2017-02-10');
insert into table test02_Visit values ('huawei','1001','2017-02-10');
insert into table test02_Visit values ('huawei','1003','2017-02-10');
insert into table test02_Visit values ('huawei','1004','2017-02-10');
insert into table test02_Visit values ('huawei','1005','2017-02-10');
insert into table test02_Visit values ('icbc','1002','2017-02-10');
insert into table test02_Visit values ('jingdong','1006','2017-02-10');
-- UV( )
select
shoop_name,
count(*) visit_count
from test02_Visit
group by shoop_name;
-- top3 。 、 id、
select
rank,
shoop_name,
user_id,
t2.visit_count
from
(
select
shoop_name,
user_id,
rank() over(partition by shoop_name order by t1.visit_count desc) rank,
t1.visit_count visit_count
from
(
select
shoop_name,
user_id,
count(*) visit_count
from test02_Visit
group by shoop_name,user_id
) t1
) t2
where rank<=3
order by shoop_name,rank;