2012-10-05 2 views
3

가능한 한 효율적으로 처리하려고합니다. Hive로 다른 열에 동일한 테이블을 효율적으로 결합하십시오.

내가 정수의 목록을 포함하는 단일 컬럼과 테이블, IDS을 말해봐,의는 'IDS'를 부르 자 :

ids 
0 
1 
2 
3 
4 
5 
6 

그리고 내가 함께, 다른 테이블, 항목이 정수의 몇 가지 열 :

item1 item2 item3 item4 
5  2  2  4 
9  2  1  19 
0  25  9  2 

내가하고 싶은 것은 표 2에서 모든 열을 선택이지만, 값이 'IDS'테이블에없는 경우 I는 NULL을합니다. 그래서 내 결과는 다음과 같습니다

item1 item2 item3 item4 
5  2  2  4 
NULL  2  1  NULL 
0  NULL  NULL  2 

내가 항목에서 선택하고 각 열에 대한 IDS에 가입하여이 작업을 수행 할 수 있습니다 :

불행하게도
SELECT CASE WHEN ids1.id IS NOT NULL THEN items.item1 ELSE NULL, 
     CASE WHEN ids2.id IS NOT NULL THEN items.item2 ELSE NULL, 
     CASE WHEN ids3.id IS NOT NULL THEN items.item3 ELSE NULL, 
     CASE WHEN ids4.id IS NOT NULL THEN items.item4 ELSE NULL, 
FROM items 
LEFT OUTER JOIN ids ids1 ON (ids1.id = items.item1), 
LEFT OUTER JOIN ids ids2 ON (ids2.id = items.item2), 
LEFT OUTER JOIN ids ids3 ON (ids3.id = items.item3), 
LEFT OUTER JOIN ids ids4 ON (ids4.id = items.item4) 

,이 테이블이 증가 할 때 큰 (수백만 행), 동일한 테이블에 4 번 참여해야한다는 것은 상당히 어려운 일입니다. 이렇게하는 것이 더 빠르고 효율적인 방법이 있습니까?

감사합니다.

+0

당신이보고에 대한 http://stackoverflow.com/questions/7412422/pivot-table-in-hive – YABADABADOU

답변

0

다음은 정규화 된 사이클, ID에 대해 테스트하기위한 왼쪽 결합, 마지막으로 다시 피킹하는 예제입니다.

create table ids (id int); 
insert ids values(0),(1),(2),(3),(4),(5),(6); 
create table items (itemid int, item1 int, item2 int, item3 int, item4 int); 
insert items select 
1,5,2,2,4 union all select 
2,9,2,1,19 union all select 
3,0,25,9,2; 

select * 
from (
    select u.itemid,ids.id,u.item 
    from items 
    unpivot (id for item in (item1,item2,item3,item4)) u 
    left join ids on ids.id = u.id 
) x 
pivot (max(id) for item in (item1,item2,item3,item4)) p 
+2

덕분에이 스레드를 살펴 할 수 있습니다. 불행히도, 하이브는 PIVOT 또는 UNPIVOT을 지원하지 않는다는 것을 이해합니다. 이것에 대한 다른 접근법을 찾을 수 있습니까? 감사! – swqnzd