2017-10-21 4 views
0

私は私のデータセットは以下の形式であるHadoopの減速カスタム書き込み可能

public class CompanyMinMaxReducer extends Reducer<Text, DateClosePair, Text, Text> { 
    private Text rText = new Text(); 

public void reduce(Text key, Iterable<DateClosePair> values, Context context) 
      throws IOException, InterruptedException { 

int min = Integer.MAX_VALUE; 
int max = Integer.MIN_VALUE; 
    LongWritable minDay = new LongWritable(); 
    LongWritable maxDay = new LongWritable(); 

for(DateClosePair val: values){ 
    LongWritable tempDate = val.getDate(); 
     DoubleWritable tempClose = val.getClose(); 

     if(tempDate.compareTo(maxDay) > 0){ 
     maxDay = tempDate; 
     }else if(tempDate.compareTo(minDay) < 0){ 
     minDay = tempDate; 
     } 


     if(tempClose.get() > max){ 
     max = (int)tempClose.get(); 
     }else if(tempClose.get() < min){ 
     min = (int)tempClose.get(); 
     } 
    } 

String minDayFinal = "" + new SimpleDateFormat("yyyy").format(new Date(minDay.get())); 
String maxDayFinal = "" + new SimpleDateFormat("yyyy").format(new Date(maxDay.get())); 
    String output = minDayFinal + " - " + maxDayFinal + " MIN: " + min + " MAX: " + max; 

    rText.set(output); 
    context.write(key, rText); 
} 
} 

この次減速クラスがあります。たとえば

exchange, stock_symbol, date, stock_price_open,stock_price_high,stock_price_low, stock_price_close, stock_volume,stock_price_adj_close. 

NASDAQ,AAPL,1970-10-22, ... 

私が書くように求めています各企業のために株式市場に存在していた年の範囲と最大と最小のclを提供する新しいMapReduceプログラム株式によって得られた価値。

私のプログラムが正しい出力を生成しますが、開始日が何らかの理由で一定である:

AAON 1970 - 2002 MIN: 1 MAX: 35 
AATI 1970 - 2010 MIN: 2 MAX: 15 
ABCO 1970 - 2004 MIN: 14 MAX: 69 
ABCW 1970 - 2007 MIN: 0 MAX: 53 
ABII 1970 - 2008 MIN: 25 MAX: 78 
ABIO 1970 - 1999 MIN: 0 MAX: 139 
ABMC 1970 - 2004 MIN: 0 MAX: 6 
ABTL 1970 - 2004 MIN: 0 MAX: 58 
ACAD 1970 - 2009 MIN: 0 MAX: 17 
ACAP 1970 - 2005 MIN: 15 MAX: 55 
ACAT 1970 - 2009 MIN: 3 MAX: 29 
ACCL 1970 - 1997 MIN: 3 MAX: 104 
ACEL 1970 - 1998 MIN: 0 MAX: 10 
ACET 1970 - 2004 MIN: 4 MAX: 27 
ACFC 1970 - 2008 MIN: 1 MAX: 20 
ACGL 1970 - 1997 MIN: 11 MAX: 80 
ACLI 1970 - 2006 MIN: 2 MAX: 77 
ACLS 1970 - 2001 MIN: 0 MAX: 30 

DateClosePairは、私はあなたがウェブ上で見つけるだろうすべての例のように書いた顧客書き込み可能です。

min_closing価格とmax_closing価格は正しいが、mix_dateとmax_dateが間違っていることは非常に奇妙です。

どのような考えですか?

答えて

0

エイリアシングが原因で発生する問題を解決しました。

maxDay = tempDate;の代わりに、maxDaytempDateオブジェクトを指している場合は、.set()というメソッドを呼び出す必要があります。

ソリューション:私はその解決策について考えている

maxDay.set(tempDate.get()); 
1

LongWritable minDay = new LongWritable()は、より正確には1970年

にご最小日付変数を初期化します。特定の値が与えられていない限り、LongWritablejava language specあたりのように、その内部long 0に初期化されます。これがjava.util.Dateに入力されると、Unixエポックから0ミリ秒と解釈されます:January 1, 1970, 00:00:00 UTC

私の推測では、1970年はデータセット内のすべての日付値の下限です。これはあらゆるキーのためにそれを書くでしょう。

私はあなたがclose値を初期化するためにint min = Integer.MAX_VALUEを使用することに気付きました。代わりにLongWritable minDay = LongWritable(Long.MAX_VALUE)を使用して解決できますか?

+0

。 'LongWritable'を' Long.MAX_VALUE/MIN_VALUE'でインスタンス化するように変更すると、min_dayとmax_dayに同じ値が得られます。出力は次のようになります。 'WEBM 2001 - 2001 MIN:0 MAX:72' ' WEDC 2008 - 2008 MIN:0 MAX:18 ' ' WEST 2003 - 2003 MIN:0 MAX:20' 'WFD 2005 - 2005 MIN:8 MAX:35' – AthanGkanos

+0

興味深い。エイリアシングの問題は[キー/値オブジェクトの再利用]に関連していますか(https://hadoop.apache.org/docs/r2.8.0/api/org/apache/hadoop/mapred/Reducer.html#reduce(K2 、%20java.util.Iterator、%20org.apache.hadoop.mapred.OutputCollector、%20org.apache.hadoop.mapred.Reporter))?私の知る限りでは、以前のバージョンでもそれを実装していたにもかかわらず、2.8.0バージョンのApacheドキュメントだけにこの事実が含まれているのは残念です。 –

+0

Writableオブジェクトを再利用すると、値を渡すのではなくエイリアシングの問題が発生したようです。私はHadoopを初めて使っているので、もっと深い理由は考えられませんが、セッターメソッドの使用は私のバグを解決するようです。 – AthanGkanos

関連する問題