2016-08-25 6 views
0

하이브가 피벗을 지원하지 않으므로 하이브에서 아래 시나리오에 대한보다 나은 접근 방법이 필요합니다.하이브에서 트랜스 포즈하는 방법

enter image description here

는 그리고 결과 아래로 변환해야합니다.

enter image description here

+0

샘플 출력을 공유하십시오. _col1, _col2의 의미는 무엇입니까 –

답변

0

Select ID, Yes from (
SELECT ID, 'Col1' as 'Yes' where Col1 = 'yes' 
UNION ALL 
SELECT ID, 'Col2' as 'Yes' where Col2 = 'yes' 
UNION ALL 
SELECT ID, 'Col3' as 'Yes' where Col3 = 'yes' 
UNION ALL 
SELECT ID, 'Col4' as 'Yes' where Col4 = 'yes' 
UNION ALL 
SELECT ID, NULL as 'Yes' where Col1 != 'yes' and Col2 != 'yes' and Col3 != 'yes' and Col4 != 'yes' 
) TempTable ORDER BY ID 
+0

효율성을 중요시한다면이 솔루션은 절대적인 재앙입니다. – gobrewers14

2

당신은이 작업을 수행 할 brickhouse (http://github.com/klout/brickhouse)에서 conditional_emit UDF를 사용할 수 있습니다 시도 할 수 있습니다.

SELECT ID, ce.feature as yes 
FROM 
table 
LATERAL VIEW conditional_emit( 
     ARRAY(col1 = 'yes', 
       col2 = 'yes', 
       col3 = 'yes', 
       col4 = 'yes', 
       col1 != 'yes' and col2 != 'yes' and col3 != 'yes' and col4 != 'yes'), 
     ARRAY('col1', 'col2', col3', 'col4', ' ')) c as ce; 

conditional_emit

는 전달 된 제 2 어레이로부터 대응하는 문자열 (전달 제 어레이)에 해당하는 배열 요소들에 대한 기록을 방출하는 UDTF이다.이 위에 단지 하나 개의 통과한다 있습니다 데이터는 UNION은 여러 번 통과합니다.