2012-09-17 2 views
0

데이터 집합의 가운데 중심 이동 평균을 계산하고 싶습니다. 내가 년의 매퍼 판매 가치를 제공 할 것입니다 RecordReader의 구현과 붙어 있어요Hadoop Map-Reduce에서 일련의 데이터의 중앙 이동 평균을 계산하는 방법은 무엇입니까?

Period Value MA Centered 
1   9 
1.5 
2   8 
2.5    9.5 
3   9   9.5 
3.5    9.5 
4   12   10.0 
4.5    10.5 
5   9   10.750 
5.5    11.0 
6   12 
6.5 
7   9 

다음

Example Input format :

quarter | sales  
Q1'11 | 9    
Q2'11 | 8 
Q3'11 | 9 
Q4'11 | 12 
Q1'12 | 9 
Q2'12 | 12 
Q3'12 | 9 
Q4'12 | 10 

수학 데이터의 표현과 이동 평균의 계산 및 평균 이동을 중심으로 즉 4 분기 중. 그 계산은 본질적으로 정렬 된 데이터를 통해 "슬라이딩 창"때문에 MR이 정렬 된 데이터의 비 교차 범위의 처리가되는 동안 이동 평균이 잘되지 않습니다 The RecordReader Problem Question Thread 감사합니다 나의 이해의 최고의에서

+0

왜이 작업에 MapReduce가 필요합니까? –

+0

우리는 R을 사용하여 구현하지만 map-reduce를 사용하여 문제를 해결하기를 원했습니다. –

답변

2

이것은 사실 MapReduce 패러다임에서 완전히 가능합니다. 그것은 '슬라이딩 윈도우 (sliding window)'로 생각할 필요는 없습니다. 대신 각 데이터 포인트가 최대 4 개의 MA 계산과 관련이 있다는 사실을 생각하고지도 함수를 호출 할 때마다 둘 이상의 키 - 값 쌍을 생성 할 수 있습니다.다음은 의사 코드입니다.

First MR job: 

map(quarter, sales) 
    emit(quarter - 1.5, sales) 
    emit(quarter - 0.5, sales) 
    emit(quarter + 0.5, sales) 
    emit(quarter + 1.5, sales) 

reduce(quarter, list_of_sales) 
    if (list_of_sales.length == 4): 
     emit(quarter, average(list_of_sales)) 
    endif 


Second MR job: 

map(quarter, MA) 
    emit(quarter - 0.5, MA) 
    emit(quarter + 0.5, MA) 

reduce(quarter, list_of_MA) 
    if (list_of_MA.length == 2): 
     emit(quarter, average(list_of_sales)) 
    endif 
+0

고마워 @Joe k 나는 이것이 나의 문제를 해결할 것이다라고 생각한다. –

+0

나는 우리가 심각한 양의 데이터를 가지고있을 때 맵 축소가 의미가 있다고 생각했다. 그리고 나서 우리는 매퍼를 한 명 더 가질 것입니다. 이 경우 매퍼 경계에서 데이터를 처리하는 방법을 잘 모릅니다. –

+0

@David 예, MapReduce는 많은 양의 데이터를 처리하기위한 것입니다. 그리고 일반적으로 map과 reduce 함수는 얼마나 많은 mappers 나 얼마나 많은 reducers가 있는지 신경 쓰지 않아야합니다. 그것은 단지 최적화 일뿐입니다. 게시 한 알고리즘에 대해 신중하게 생각한다면 어떤 매퍼가 데이터의 어느 부분을 차지하는지 상관하지 않음을 알 수 있습니다. 각 입력 레코드는 필요한 모든 작업을 줄일 수 있습니다. –

1

는 맵리 듀스 패러다임에 매핑됩니다.
해결책 다음과 같습니다 :
a) 두 번의 다른 실행에서 두 개의 다른 파티션을 만들 수있는 사용자 정의 파티션 도구를 구현합니다. 각 실행에 당신의 감속기는 서로 다른 데이터 범위를 얻을 approprieate
내가 설명하기 위해 노력할 것입니다 경우 이동 평균 계산합니다 : 감속기에 대한 첫 번째 실행 데이터에서
가 있어야한다 :
R1 : Q1, Q2, Q3, Q4
R2 : Q5, Q6, Q7, Q8
...

여기에 일부 Q에 대한 이동 평균이 포함됩니다.

다음 실행에

같은 데이터를 얻을해야 당신의 감속기 : R1 : Q1 ... Q6
R2 :
R3 Q6을 ... Q10 : Q10..Q14

그리고 나머지 caclulate 이동 평균.
그런 다음 결과를 집계해야합니다.

사용자 정의 분할 프로그램은 두 개의 작동 모드를 가질 것입니다. 매번 동일한 범위로 나뉘지만 약간의 이동이 있습니다. 가상 코드에서 다음과 같이 보입니다.
파티션 = (key + SHIFT)/(MAX_KEY/numOfPartitions);
여기서, 구성에서 SHIFT를 가져옵니다.
MAX_KEY = 키의 최대 값. 나는 그들이 0으로 시작할 것을 간략하게 가정한다.

RecordReader, IMHO는 특정 분할로 제한되어 있으며 분할 경계 위로 이동할 수 없기 때문에 해결책이 아닙니다.

또 다른 솔루션은 입력 데이터를 분할하는 사용자 지정 논리를 구현하는 것입니다 (이는 InputFormat의 일부입니다). 분할과 마찬가지로 2 개의 다른 슬라이드를 수행 할 수 있습니다.

+0

Thanks @ David Gruzman 매퍼에 "슬라이딩 입력"을 위해 RecordReader를 구현하려고했지만 거기에 갇혀 있습니다. [thread RecordReader Qus] (http://stackoverflow.com/questions/12455088/how-to- 계산 중심의 이동 평균 데이터 후프 가드 맵 감소) 맞춤식 파티셔 (논리) 구현에 대한 자세한 정보를 제공 할 수 있습니까? –

+0

나는 나의 대답을 편집했다 –

관련 문제