빅데이터

[맵리듀스] map클래스

romance penguin 2017. 1. 5. 19:16
반응형

package MapReduce;

import java.io.IOException;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.Text;

public class CountMapper extends TableMapper<Text, FloatWritable>  {
//hbase가 지원하는 table형식의 맵퍼를 상속받는다.
   
    private Text key = new Text(); //text형식의 ket로 리듀스에 보낼거고
    private FloatWritable output = new FloatWritable(); //float형식의 output으로 리듀스에 보낸다.
   
    @Override
    public void map(ImmutableBytesWritable row, Result value, Context context) throws InterruptedException, IOException{
        //hbase부터 들어올 데이터,key형식은 byte이고 value는 result(???뭔 타입인진 모르겠다.)
       
        key.set(new String(value.getRow()));
       
        for(Cell c : value.rawCells()){
            String qualifier = new String(CellUtil.cloneQualifier(c));
           
            if(qualifier.equals("data")){
                Float f = Float.parseFloat(new String(CellUtil.cloneValue(c)));
                output.set(f);
                context.write(key, output); //reduce로 보내는 key와 output
            }
        }
           
    }
}

책에 있는 소스코드인데 지금 형식을 대충 보자면

hbase는 key ,value형식으로 저장되는데

리듀스로 보낼때 value만 쓰고있다. key값은 배제 ( 쓰지않는다는거다. )

나는 key( 항공사 번호,항공기 번호) , value( distance )를 다 받아야되서

distance컬럼만 받게 필터링하고

byte형식의 key를 받아서 string으로 형변환 해줘야 한다.


reduce에서는 항공번호 별로 iterable된 distance를 받아 평균값을 구해줄거다.

1. 평균값을 구하기 위해선 항공번호 별로 count한 데이터파일을 join 하거나

2. reduce상에서 +1로 count해준후 나누거나

3. 맵퍼단계에서 미리 count를 해주거나 ??


**어떤걸 쓰지?

반응형