2017-10-21 121 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, ... 

我被要求写一个新的MapReduce程序,为每家公司提供它在股市中存在的年数范围,以及最大和最小值cl计入股票获得的价值。

我的程序产生正确的输出,但起始日期是出于某种原因常数:

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;现在maxDay指向tempDate对象,我应该调用方法.set()

解决方案:

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

LongWritable minDay = new LongWritable()初始化您的最小日期变量,以1970年

更确切地说,除非给出了具体的数值,LongWritable初始化其内部long到0%的java language spec。当它被输入到java.util.Date时,它将被解释为从Unix纪元:January 1, 1970, 00:00:00 UTC 0毫秒。

我的猜测是1970年是数据集中所有日期值的下限。这将写入每个密钥。

我注意到你用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))在reduce函数中?看起来令人沮丧的是(据我所知),只有2.8.0版本的Apache文档包含这个事实,即使之前的版本也实现了它。 –

+0

看起来像Writable对象的重用造成了别名问题,当我对它们进行别名而不是传递值时。我是Hadoop的新手,所以我想不出任何更深的原因,尽管使用setter方法似乎解决了我的错误。 – AthanGkanos