2016-09-12 8 views
0

セカンダリソートの例では、年と温度。私たちは複合キーとして年と気温を取る。そして、その年の最高温度を印刷するための最初のキー値ペアを印刷します。Hadoopでセカンダリソートを使用して2番目の最高温度を見つける方法は?

1900 35°C
1900 34°C

protected void reduce(IntPair key, Iterable<NullWritable> values, 
Context context) throws IOException, InterruptedException { 
    context.write(key, NullWritable.get()); 
} 

今なら
1900 34°C
...
1901 36°C
1901 35°C私たちはそれをどうやって行うことができるのか、特定の年の第2の最大値を印刷したいと思います。

protected void reduce(IntPair key, Iterable<IntWritable> values, 
Context context) throws IOException, InterruptedException { 
    ... 
} 

目的とした:

答えて

0

この方法は、あなたのreduceメソッドシグネチャのようなものに変更する必要がありますので、temperatureも、値として設定する必要がありますが、これを行うことはできません設定です二次的なソートは、複合キーを使用しての値をソートすることです。値がNullWritableの場合、これが機能しなくなるためです。値に温度が設定されたら、それらの値を反復して最初の値を無視することで、2番目の最大値を得ることができます。たとえば:

protected void reduce(IntPair key, Iterable<IntWritable> values, 
Context context) throws IOException, InterruptedException { 
    boolean first = true; 
    for (IntWritable temp : values) { 
     if (!first) { 
      context.write(key, temp); 
      return; 
     } else { 
      first = false; 
     } 
    } 
} 

今、温度が値であることを、あなたはただ二、終了を書き出し、最初のものを無視し、それらを反復処理することができます。

注:このコードでは、温度が重複していないことを前提としています。

関連する問題