달나라 노트

Hive : percentile (백분률 구하기, 백분위 구하기) / 백분위로 중간값(median) 구하기 본문

SQL/Apache Hive

Hive : percentile (백분률 구하기, 백분위 구하기) / 백분위로 중간값(median) 구하기

CosmosProject 2023. 11. 28. 23:44
728x90
반응형

 

 

 

데이터를 다루다 보면 전체에 대한 백분위를 구할 때가 있습니다.

 

이럴 때에는 percentile이라는 유용한 함수를 사용할 수 있습니다.

 

 

Syntax

percentile(column, percent)

 

- column

백분위를 구할 데이터가 있는 대상 column

 

- percent

상위 몇%를 의미

 

 

 

 

 

 

 

Table = test_table

col1 col2
a 1
a 2
a 3
b 1
b 6
b 7
c 1
c 2
d 2
d 2
d 4
d 1

 

위같은 table이 있다고 가정합시다.

 

 

select  col1
        , percentile(col2, 0.5) as result_col
from test_table
--
group by col1
;

 

col1 result_col
a 2
b 6
c 1.5
d 2

 

쿼리와 결과입니다.

 

결과에 대한 해석이 필요합니다.

 

select  col1
        , percentile(col2, 0.5) as result_col
from test_table
--
group by col1
;

 

일단 쿼리를 보면 위와 같습니다.

col2를 기준으로 percentile() 함수를 적용했습니다.

 

percentile() 함수를 보면 col2, 0.5가 parameter로서 주어졌는데 col1에 존재하는 값 별로 col2에 있는 값 기준 50%에 있는 값을 구하라는 것입니다.

 

col1 col2
a 1
a 2
a 3

 

col1 result_col
a 2

 

 

먼저 col1 = a인 값들만 보겠습니다.

col1 = a인 값들에 대해 col2값은 1, 2, 3 총 3개가 있습니다. 이 중 상위 50%의 값은 2입니다.

 

 

 

 

 

col1 col2
b 1
b 6
b 7

 

col1 result_col
b 6

 

col1 = b인 값입니다.

col1 = b인 행에 대해 col2에는 1, 6, 7이라는 데이터가 있습니다.

이 중 50% 위치에 있는 값은 바로 중간값 6입니다.

 

 

 

 

col1 col2
c 1
c 2

 

col1 result_col
c 1.5

 

col1 = c인 값에 대해서는 col2 = 1, 2 가 있습니다.

이 경우 50% 위치에 있는 값이 없습니다.

따라서 1과 2의 사이인 1.5가 됩니다.

 

 

 

 

 

 

col1 col2
d 2
d 2
d 4
d 1

 

col1 result_col
d 2

 

col1 = d인 행에 대해서는 col2 = 1, 2, 2, 4 가 있습니다.

중복은 무시하고 여기서 50% 위치에 있는 값은 2입니다.

따라서 2가 return됩니다.

 

 

 

 

 

 

 

with
temp_median as (
    select  col1
            , percentile(col2, 0.5) as median
    from test_table
)
--
select  tt.*
        , m.median
from test_table as tt
--
left join temp_median as m
    on m.col1 = tt.col1
;

 

이를 이용하면 위처럼 원본 데이터에 중간값을 구하여 하나의 컬럼으로 만들 수도 있습니다.

 

 

 

 

 

 

728x90
반응형
Comments