2014-06-16 2 views
0

R (Hadoop Streaming)을 사용하여 기본 MapReduce를 작성하려고합니다.R 하둡 매퍼 오류 첨자가 범위를 벗어났습니다.

1 15.55511341 
2 27.53983952 
3 39.7767569 
4 47.44065279 
5 55.0606804 
6 68.57527802 
7 77.03639749 
8 80.92939421 
9 94.4431412 
10 106.5353655 

내가 다음 명령을 사용하여 명령 프롬프트에 직접 매퍼를 실행 시도 : 아래 주어진

#! /usr/bin/env Rscript 

con <- file("stdin",open = "r") 

while(length(line <- readLines(con = con,n = 1,warn = FALSE)) > 0) 
{ 
    line1 <- gsub("^\\s+|\\s+$", "", line) 
    if(is.null(strsplit(line1," ")) == FALSE){ 
    x <- as.numeric(unlist(strsplit(line1," "))[[1]]) 
    y <- as.numeric(unlist(strsplit(line1," "))[[2]]) 
    x2 <- x*x 
    xy <- x*y 
    cat(x,"\t",y,"\t",xy,"\t",x2,"\n") 
    } 
} 

close(con) 

이에 대한 입력 파일은 두 개의 열이 있습니다 다음은 내가 쓴 매퍼 기능입니다 :

:

cat ../data/Input.txt | ./mapper.R 

는 그러나, 나는 다음과 같은 오류 메시지가

코드에서 몇 가지 기본적인 실수를 저지른 것처럼 보입니다. 누군가이 문제와 관련하여 나를 도울 수 있습니까?

+0

입력 텍스트의 첫 번째 줄에는 공백이 2 개 있습니다. 두 번째, 세 번째 등등. 'strsplit'으로 분할하기 전에 각 라인의 공백 수를 계산해야합니다. –

+0

어떻게 공백을 찾았습니까? 텍스트 파일에서 두 값 사이의 탭만 볼 수 있습니다. 나는 공백을 다듬기 위해 다음 두 줄을 추가하려고했다. trimWhiteSpace <- function (line) gsub ("(^ +) | (+ $)", "", line); (strsplit (line1, "")) [1] : 범위 밖의 첨자 실행 중지 – Ravi

+0

그래서 재현 할 수없는 예제입니다. 그리고' '\ t' '를 사용하여 표를 제거하는 것이 좋습니다. –

답변

1

gsub에 사용중인 regex에 문제가 있습니다. 다음 코드를 사용해보십시오.

con <- file('stdin',open = 'r') 
while(length(line <- readLines(con = con,n = 1,warn = FALSE)) > 0) 
    { 
     line1 <- gsub('\\s+', ' ', line) 
     line1 <- gsub("^\\s+|\\s+$", '', line1) 
     res <- unlist(strsplit(line1,' ')) 
     if(length(res)==2){ 
      x <- as.numeric(res[1]) 
      y <- as.numeric(res[2]) 
      x2 <- x*x 
      xy <- x*y 
      cat(x,"\t",y,"\t",xy,"\t",x2,"\n") 
     } 
    } 

close(con) 

그것은 나를 위해 일했습니다.

+0

이것은 실행됩니다 10 줄에 대한 코드를 잘하고 올바른 출력을 생산하지만 끝에 다음과 같은 오류가 throw됩니다. unlist (strsplit (line1, "")) [1] : 범위 바깥 쪽 아래 첨자 실행 중지 – Ravi

+0

수 있습니다. –

+0

두 개의 탭으로 구분 된 열이 포함 된 txt 파일이 있습니다 (원래 게시물에 표시된 것처럼). 그것은 원래 게시물에 주어진 것과 동일한 10 개의 행을 포함합니다. – Ravi