2014-07-21 2 views
2

어떤 이유로 rmr2가 특정 상황에서 키를 부적절하게 처리하여 각 값의 키를 복제하는 것으로 보입니다.rmr2가 내 매퍼에서 키를 복제 중임

Windows 7에서 R 버전 3.1.1 (64 비트 버전)을 사용하고 있습니다. 내 rmr 버전은 rmr2_2.3.0입니다.

rmr.options (backend = "local")를 설정하여 로컬 모드를 사용하고 있습니다.

library(rmr2) 

from.dfs(
    mapreduce(
    input=f, 
    input.format="text", 
    map = function(k,v) keyval(k,v))) 
:

a|1|blue 
b|2|green 
c|1|green 
d|3|blue 
e|2|yellow 

내가 쉽게 f는 내 파일의 경로입니다 다음지도-감소 일 이러한 내용을 검색 할 수 있습니다

나는이 내용은 매우 간단한 텍스트 파일이

출력은 예상대로입니다 :

$key 
NULL 

$val 
[1] "a|1|blue" "b|2|green" "c|1|green" "d|3|blue" "e|2|yellow" 

은 내가 LENG를 할당 작업을 줄이고 다른지도를 실행할 수 있습니다 키로 선의 번째는 감속기에 전달한다 :

예상대로
from.dfs(
    mapreduce(
    input=f, 
    input.format="text", 
    map = function(k,v) keyval(str_length(v),v))) 

출력이 대신 값의 길이

$key 
[1] 8 8 9 9 10 

$val 
[1] "a|1|blue" "d|3|blue" "b|2|green" "c|1|green" "e|2|yellow" 

는 I 대신 첫 번째 문자를 취할 수 :

from.dfs(
    mapreduce(
    input=f, 
    input.format="text", 
    map = function(k,v) keyval(substr(v,0,1),v))) 

출력은 다시 예상대로이다

지금까지 그렇게 좋았습니다. 이제 값을 나누고 첫 번째 필드를 사용하고 싶습니다. 내 코드는 다음과 같습니다

from.dfs(
    mapreduce(
    input=f, 
    input.format="text", 
    map = function(k,v) keyval(unlist(strsplit(v,'\\|'))[1],v))) 

출력이 매우 예기치 않게이며,이 시간 :

$key 
[1] "a" "a" "a" "a" "a" 

$val 
[1] "a|1|blue" "b|2|green" "c|1|green" "d|3|blue" "e|2|yellow" 

내가 대신 키 벡터 존재의, 문자열을 사용하여 이전 예제와 같은 출력을 볼 기대 "a" "b" "c" "d" "e"이것은 첫 번째 키가 단지 5 번 반복 된 것입니다. "a" "a" "a" "a" "a".

나는 세 번째 필드에 예를 들어 내가 얻으려고 노력하고있는 필드를 변경할 수 있습니다

from.dfs(
    mapreduce(
    input=f, 
    input.format="text", 
    map = function(k,v) keyval(unlist(strsplit(v,'\\|'))[3],v))) 

다시 첫 번째 키 대신 모든 값에 대한 고유 키의 반복

. 출력은 다음과 같습니다.

$key 
[1] "blue" "blue" "blue" "blue" "blue" 

$val 
[1] "a|1|blue" "b|2|green" "c|1|green" "d|3|blue" "e|2|yellow" 

나는 이것으로 끝내고 있습니다. 무슨 일 이니? 이것은 rmr2의 버그입니까, 아니면 무엇입니까?

업데이트 : 완전히 분산 된 HDP2 클러스터가있는 rmr2_3.1.1을 실행하는 우분투 12.04 시스템에서 동일한 예제를 시도하고 거의 동일한 결과를 얻었습니다. 기대 한 결과를 반환하는 예제의 경우, 키 쌍의 순서가 파일 (이해할 수 있음)과 같지 않다는 유일한 차이점이 있습니다.문제가있는 예제의 경우 더 이상한 결과가 나옵니다.

$key 
[1] "d" "d" "a" "a" "a" 

$val 
[1] "d|3|blue" "e|2|yellow" "a|1|blue" "b|2|green" "c|1|green" 
+0

당신이 당신의 순발력 끝에 있다면, 아마도 rmr2의 이슈 트래커에 버그를 제기 할 시간 . SO보다 더 많은 인터넷이 있습니다. – piccolbo

답변

3

내 질문에 답합니다. 질문에 대한 답은 맵 함수에 입력 된 (k, v) 매개 변수의 구조가 무엇인지 이해 (추측)하는 것입니다. 그것들은 가치의 매개체 인 것처럼 보입니다. 즉, 맵 함수는 분할의 모든 값을 포함하는 벡터로 단일 시간이라고합니다. Hadoop 스트리밍이 사용 중이기 때문에 가능합니다. 이것을 각 값에 대해 한 번 호출되고 각 호출에서 하나의 값만 수신하는 일반적인 Java Hadoop 맵 함수와 대조하십시오.

그래서 해결책은 사용하는 것입니다 원하는 resut을 생산

from.dfs( 
    mapreduce(
    input=f, 
    input.format="text", 
    map = function(k,v) keyval(matrix(unlist(strsplit(v,'\\|')),nrow=length(v),byrow=TRUE)[,1],v))) 

:

$key 
[1] "d" "e" "a" "b" "c" 

$val 
[1] "d|3|blue" "e|2|yellow" "a|1|blue" "b|2|green" "c|1|green" 
+0

당신 솔루션에 감사드립니다. 정말 도움이되었습니다. 나는 지난 이틀 동안 같은 문제에서 엉망이었다. 이'map'과'reduce' 등의 의미를 확인할 수있는 문서가 있습니까? –

+0

감사합니다 백만, 이건 내 문제를 해결 – jeremycg