Skip to content

Latest commit

 

History

History
37 lines (27 loc) · 1.57 KB

정규 표현식 - 중복 제거.md

File metadata and controls

37 lines (27 loc) · 1.57 KB

정규 표현식 - 중복 제거

회사에서 Hive에 저장된 로그를 분석하는 일을 하다가 이런 케이스를 만나게 되었다.

상품 추천 리스트: '상품코드:추천방법코드,상품코드:추천방법코드,상품코드:추천방법코드,상품코드:추천방법코드, ...'

이걸 추천방법코드 기준으로 중복이 없도록 카운트하라.

예를 들어, 'prod1:1,prod2:2,prod3:2,prod4:3,prod5:4,prod6:4' 이런 데이터를 그냥 쉼표로 구분해서 6행으로 처리하려면 LATERAL VIEWexplode를 사용하면 간단하게 처리할 수 있는데, 추천방법코드 기준으로 중복을 제거하고 유일값인 1, 2, 3, 4 이렇게 4행으로 처리되어야 한다니 얘기가 좀 다르다.

아.. 이건 그동안 해왔던 방식으로는 안 될 것 같아서 좀 머리가 아픈데.. 라고 고민하다가, 행으로 나눈 후에 중복 제거를 할 게 아니라 행으로 나누기 전에 문자열 수준에서 중복을 제거하면 되겠다! 라는 생각이 들어 찾아보니, 언제봐도 외계어 같은 정규 표현식인데 정말로 블랙홀에서 방금 튀어 나온 것 같은 현란한 방법이 있었다.

regexp_replace(
    쉼표로구분되어중복이포함된문자열
    ,'(?<=^|,)(?<word>.*?),(?=.*(?<=,)\\k<word>(?=,|$))'
    ,''
)

Hive에서 아래와 같이 쓸 수 있다.

select
regexp_replace(
    'abc,abc,a,def,def,123,12,123,12'
    ,'(?<=^|,)(?<word>.*?),(?=.*(?<=,)\\k<word>(?=,|$))'
    ,''
)
;

result
abc,a,def,123,12

덕분에 집에 갈 수 있었다.