복붙노트

[HADOOP] 감속기의 입력 파일을 가져 오기

HADOOP

감속기의 입력 파일을 가져 오기

내가 두 번 값을 반복 할 필요가 어디에서 맵리 듀스 작업을 쓰기 위해 노력하고 있어요.

수치 csv 파일이 주어 그래서 우리는 각 열에 대해이를 적용해야합니다.

이를 위해, 우리는 최소 및 최대 값을 발견하고, 식 (V1)에이를 적용해야한다.

내가 지금까지했던 것은

In map()
I emit the column id as key and each column as values
In Reduce()
I calculated the min and max values of each column.

그 후 나는 붙어입니다. 내 목표는 방정식을 적용하는 것입니다 다음으로

(V = (V - 미나) / (MAXA - 미나) * (새 MAXA - 새로운 미나) + 새로운 미나)

나의 새로운 MAXA 새로운 미나는 각각 0.1,0.0이며, 또한 각 열은 최대 및 최소 있습니다. 나는 V를 얻을 필요는 식의 (V1)을 적용 중위, 입력 파일을 즉.

어떻게 얻을 수 있습니까?

내가 불렀어 무슨 생각

입력 CSV 파일에서 첫 번째 행 (홍채 데이터 집합을) 받아

[5.3,3.6,1.6,0.3]

각 속성 EQN 적용 전체 행 (최소 및 최대 값은 감속기 자체로 알려진) 방출. 그러나 감속기에 난 단지 열을 얻을 것이다 values.Or 다른 나는 () 감속기의 () 설정에서 인수로 내 inputfile을 읽어야합니다.

최선의 관행 때문이다. 어떤 제안.

최신 정보

마크 커리가 제안한 것처럼 나는 다음을했다.

public void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException,
    InterruptedException {
System.out.println("in reducer");
double min = Integer.MAX_VALUE,max = 0;
Iterator<DoubleWritable> iterator = values.iterator();
ListIterator<DoubleWritable> lit = IteratorUtils.toListIterator(iterator);
System.out.println("Using ListIterator 1st pass");
while(lit.hasNext()){
    System.out.println(lit.next());
    DoubleWritable value = lit.next();
    if (value.get()< min) { 
        min = value.get();
    }
    if (value.get() > max) {
        max = value.get();
    }
}
System.out.println(min);
System.out.println(max);

// move the list iterator back to start
while(lit.hasPrevious()){
    lit.previous();
}

System.out.println("Using ListIterator 2nd pass");
double x = 0;
while(lit.hasNext()){
    System.out.println(lit.next());

}

1 일 패스에서 나는이 모든 값 correctly.But을 얻을 차 난 단지 반복 각 요소를 얻고 통과 할 수 있어요.

해결법

  1. ==============================

    1.당신은 두 번 같은 축소에 감속기 값을 이상 열거 할 수있다. 첫 번째 시간은 최소 및 최대 및 귀하의 값을 계산 한 후이를 방출하는 두 번째 시간을 계산합니다.

    당신은 두 번 같은 축소에 감속기 값을 이상 열거 할 수있다. 첫 번째 시간은 최소 및 최대 및 귀하의 값을 계산 한 후이를 방출하는 두 번째 시간을 계산합니다.

    거친 예 :

    public void Reduce(string key, List<string> values, Context context)
    {
        var minA = Min(values);
        var maxA = Min(values);
    
        foreach (var v in values)
        {
            var result = [(v − minA)/(maxA − minA)]*(new maxA − new minA ) + new minA;
    
            context.Emit(result);
        }
    }
    
  2. ==============================

    2.나는 답을 발견했다. 우리는 아래로 감속기에 두 번 반복하려는 경우

    나는 답을 발견했다. 우리는 아래로 감속기에 두 번 반복하려는 경우

        ListIterator<DoubleWritable> lit = IteratorUtils.toListIterator(it);
        System.out.println("Using ListIterator 1st pass");
        while(lit.hasNext())
            System.out.println(lit.next());
    
        // move the list iterator back to start
        while(lit.hasPrevious())
            lit.previous();
    
        System.out.println("Using ListIterator 2nd pass");
        while(lit.hasNext())
            System.out.println(lit.next());
    

    로 우리는 것이다에만 출력

    Using ListIterator 1st pass
    5.3
    4.9
    5.3
    4.6
    4.6
    Using ListIterator 2nd pass
    5.3
    5.3
    5.3
    5.3
    5.3
    

    중위 우리는이 같은 루프해야 올바른 방법으로 그것을 얻을 수 있습니다 :

    ArrayList<DoubleWritable> cache = new ArrayList<DoubleWritable>();
     for (DoubleWritable aNum : values) {
        System.out.println("first iteration: " + aNum);
        DoubleWritable writable = new DoubleWritable();
        writable.set(aNum.get());
        cache.add(writable);
     }
     int size = cache.size();
     for (int i = 0; i < size; ++i) {
         System.out.println("second iteration: " + cache.get(i));
      }
    

    산출

    first iteration: 5.3
    first iteration: 4.9
    first iteration: 5.3
    first iteration: 4.6
    first iteration: 4.6
    second iteration: 5.3
    second iteration: 4.9
    second iteration: 5.3
    second iteration: 4.6
    second iteration: 4.6
    
  3. from https://stackoverflow.com/questions/22005722/get-input-file-in-reducer by cc-by-sa and MIT license