私は私のデータセットは以下の形式である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が間違っていることは非常に奇妙です。
どのような考えですか?
。 '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
興味深い。エイリアシングの問題は[キー/値オブジェクトの再利用]に関連していますか(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ドキュメントだけにこの事実が含まれているのは残念です。 –
Writableオブジェクトを再利用すると、値を渡すのではなくエイリアシングの問題が発生したようです。私はHadoopを初めて使っているので、もっと深い理由は考えられませんが、セッターメソッドの使用は私のバグを解決するようです。 – AthanGkanos