2012-05-11 2 views
2

변환 스크립트 (R로 작성)가 있는데, 테이블의 서브 세트에서 실행하고 싶습니다. 나는. 나는 실행하기 위해 많은 단계를 줄이기를 원한다.테이블 서브 세트에 하이브 (Hive) 변환 스크립트를 실행하십시오.

원본 테이블에 {C1, C2, C3} 열이 있다고 가정하면 변형은 C1의 다른 값에서 실행되어야하며 C2와 C3는 입력 데이터로 전달되어야 결과와 함께 C1 값이 출력됩니다.

이 문제를 해결하기 위해 Hive DISTRIBUTE 연산을 살펴 보았지만 올바른 구문/메커니즘을 파악할 수는 없습니다. 예를 들어

이 내 테이블 인 경우

C1,C2 
a,1 
a,2 
b,1 
b,2 
b,3 

나의 스크립트 테이블의 각 서브 세트에 대해 C2의 평균 값을 반환 C1은, 결과가 같아야

C1,D1 
a,1.5 
b,2 

구문 상으로는 내가하고 싶은 의사 코드가입니다. my_table에 C1, C2 열이 있다고 가정합니다.

from my_table 
select 
    C1, 
    transform(
    C2 
) 
using 'my_script.R' 
distribute by C1 
; 

답변

1

스크립트는 맵 구성 요소가없는 축소 스크립트입니다. ID 매퍼 (/ bin/cat)를 사용하여 입력을 감소 부분에 공급해야합니다. 지도와 감축 사이에는 셔플 단계가 있으며 이는 DISTRIBUTE BY C1 절을 처리합니다. 여기 내가 쓴, 그것을 확인하는 기회를 확보하지 무언가 빠른 :

FROM (
    FROM my_table 
    MAP C1, C2 
    USING '/bin/cat' 
    AS C1, C2 
    DISTRIBUTE BY C1) map_output 
INSERT OVERWRITE TABLE mean_table 
    REDUCE map_output.C1, C2 
    USING 'my_script.R' 
AS C1, mean; 

그것을 보장 것 잊지 마세요를 그 키의 값이 같은 모든 레코드 (C1, 귀하의 경우) 같은 감속기로 이동하십시오 (즉, 스크립트의 동일한 인스턴스 생성). 그러나 같은 감속기에 설정된 입력에서 다른 키 값을 가진 다른 레코드를 가질 수 있습니다.

예를 들어, A, 1 모두 2 B, 1 B, 2 B, 3 이 같은 감소 스크립트로 이동을 할 수 있습니다. 따라서 감속기의 입력 레코드를 깨뜨릴 수 있어야합니다.

+1

감사 마크. 이것이 내 스크립트가 데이터의 부분 집합에서만 실행된다는 것을 의미하지는 않기 때문에 이것이 문제를 해결하는지 확신 할 수 없습니다. 여전히 'a'행 대 'b'행을 명시 적으로 처리해야합니다. 나는. 내 스크립트가 단순히 실행중인 평균을 계산하면 실패합니다. – yoni

관련 문제