2014-11-11 8 views
-1

매퍼에서 문자열을 값으로 전달하려고 시도했지만 쓰기가 불가능하다는 오류가 발생했습니다. 해결 방법?매퍼에서 문자열을 값으로 전달하는 방법은 무엇입니까?

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 

    String TempString = value.toString(); 
    String[] SingleRecord = TempString.split("\t"); 

    //using Integer.parseInt to calculate profit 
    int Amount = Integer.parseInt(SingleRecord[7]); 
    int Asset = Integer.parseInt(SingleRecord[8]); 
    int SalesPrice = Integer.parseInt(SingleRecord[9]); 
    int Profit = Amount*(SalesPrice-Asset); 

    String ValueProfit = String.valueOf(Profit); 
    String ValueOne = String.valueOf(one); 

    custID.set(SingleRecord[2]); 
    data.set(ValueOne + ValueProfit); 
    context.write(custID, data); 

} 
+0

'데이터'란 무엇이며 'custId'는 무엇입니까? –

답변

0

야후의 튜토리얼은 말한다 : 또는 파일로부터 네트워크를 통해 마샬링 할 수
객체는 하둡이 직렬화 된 형태로 데이터를 읽고 쓸 수 있도록 쓰기 가능라는 특정 인터페이스를, 순종해야 전송 용. 클라우 데라의 사이트에서

:
키와 값 클래스는 쓰기 가능 인터페이스를 구현해야합니다 따라서 프레임 워크에 의해 직렬화 가능해야합니다. 또한 키 클래스는 정렬을 용이하게하기 위해 WritableComparable 인터페이스를 구현해야합니다.

따라서 구현을 Writable으로 설정해야 문맥에서 값으로 쓸 수 있습니다. Hadoop에는 IntWritable과 같은 몇 가지 클래스가 있습니다. 찾고있는 해당 StringText 클래스입니다. 그것은으로 사용할 수 있습니다

context.write(custID, new Text(data)); 

또는

Text outValue = new Text(); 
val.set(data); 
context.write(custID, outValue) 

I의 경우, 당신은 값 클래스에 특화된 기능이 필요, 당신은 Writable (안 큰 문제가 결국)를 구현 할 수 있습니다. 그러나 Text처럼 보이면 충분합니다.

+0

우리가 당신의 제안을 시도했지만 여전히 오류가 점점 :이 줄 \t에서 여러 마커 - 생성자 텍스트 (IntWritable하는) 정의되지 \t - 유형 \t TaskInputOutputContext 은 인수에 적용 할 수 없습니다. \t (텍스트, 텍스트) –

+0

아마도 '데이터'는 'IntWritable'입니다. 빠른 해결책을 얻으려면'매퍼 (Mapper) '의 완전한 코드를 공유하십시오. – blackSmith

+0

'public void map (LongWritable 키, 텍스트 값, 컨텍스트 컨텍스트)은 IOException, InterruptedException을 던집니다. { String TempString = value.toString(); String [] SingleRecord = TempString.split ("\ t"); int Amount = Integer.parseInt (SingleRecord [7]); int Asset = Integer.parseInt (SingleRecord [8]); int SalesPrice = Integer.parseInt (SingleRecord [9]); int Profit = 금액 * (SalesPrice-Asset); String ValueProfit = String.valueOf (Profit); String ValueOne = String.valueOf (one); custID.set (SingleRecord [2]); context.write (custID, new Text (data)); }' –

0

위의 가져 오기 텍스트에 따라지도 기능에서 데이터를 설정하지 않아도 TextWritable이 잘못되었습니다. 텍스트도 사용하십시오.

+0

안녕하세요, StackOverflow에 오신 것을 환영합니다! 코드 스 니펫이나 예제를 제공하는 것이 도움이 될 것입니다 ([how to answer] (http://stackoverflow.com/help/how-to-answer) 참조). –