Hive 창 함수 문법 상세 설명 및 안 열

Hive 창 함수 문법 상세 설명 및 안 열
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;

좋은 웹페이지 즐겨찾기