2016-11-02 6 views
0

Mahout과 함께 사용하기 위해 {userID, itemID, rating} 형식으로 변환하려고 시도하는 사용자 ID, itemID 등급 매트릭스 형식의 데이터 세트가 있습니다. 여기에 설명 된대로 항목 기반 권장 사항 : https://mahout.apache.org/users/recommender/userbased-5-minutes.html#dataset행렬 데이터 모델을 Mahout 권장 사항에 대한 파일 데이터 모델로 변환

1 2 3 
1 1.0 2.0 3.0 
2 4.0 5.0 6.0 
3 7.0 8.0 9.0 

이 같은 속으로 : 즉

, 나는 이런 식으로 뭔가를 변환 할이 사용하는 아파치 하둡 도구를 달성 할 수있는 방법이 있나요

1,1,1.0 
1,2,2.0 
1,3,3.0 
2,1,4.0 
2,2,5.0 
2,3,6.0 
3,1,7.0 
3,2,8.0 
3,3,9.0 

(돼지, 하이브 , 등)?

답변

0

당신은 explode (하이브)를 사용할 수 있습니다 :

당신의 입력 테이블이 보이는 경우 :

userID item1 item2 item3 
---------------------- 
1  1.0 2.0 3.0 
2  4.0 5.0 6.0 
3  7.0 8.0 9.0 

그런 다음 쿼리가 될 수 있습니다

SELECT userID, split(item_val,'_')[0] as item, split(item_val,'_')[1] as val  
from (SELECT userID, 
     array(concat_ws('_','item1',item1), 
     concat_ws('_','item2',item2), 
     concat_ws('_','item3',item3)) as arr from in_table) a 
LATERAL VIEW explode(arr) exp as item_val; 

설명 : 내부 쿼리를 이 출력을 생성합니다 :

userID     arr 
----------------------------------------- 
1  (item1_1.0 item2_2.0 item3_3.0) 
2  (item1_4.0 item2_5.0 item3_6.0) 
3  (item1_7.0 item2_8.0 item3_9.0) 

그런 다음 폭발 후 각 줄에 userID, itemID 및 value가 표시되며 itemID와 값을 분할하면됩니다.

또한 테이블의 itemID가 double으로 정의되어있는 경우 concat_ws으로 보내기 전에 CAST(item2 as string)이 필요합니다.

+0

내가 이것을 시도하면 "문을 컴파일하는 동안 오류가 발생합니다 : FAILED : ParseException 라인 6 : 8 'LATERAL'근처의 'VIEW'에 EOF가 없습니다." 내부 쿼리가 올바르게 작동합니다. 무슨 일있어? – mmolenda

+0

내부 테이블의 이름을 잊어 버렸습니다. - 지금 시도하십시오 –

+0

그 트릭을했습니다. 또한, 두 번째 분할은 'split (item_val,'_ ') [1]을 val로 사용합니다. – mmolenda