簡體   English   中英

Hadoop Reducer 自定義可寫

[英]Hadoop Reducer Custom Writable

我有以下Reducer類

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 程序,為每家公司提供它在股票市場上存在的年數范圍,以及股票獲得的最大和最小收盤價。

我的程序產生正確的輸出,但由於某種原因開始日期是恆定的:

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_close 價格和 max_close 價格是正確的,但 mix_date 和 max_date 錯誤。

有什么想法嗎?

LongWritable minDay = new LongWritable()將您的最小日期變量初始化為 1970。

更准確地說:除非給定一個特定的值, LongWritable根據java 語言規范將其內部long初始化為 0 。 當它被輸入java.util.Date ,它被解釋為 Unix 紀元的 0 毫秒: January 1, 1970, 00:00:00 UTC

我的猜測是 1970 年是數據集中所有日期值的下限。 這將為每個鍵編寫它。

我注意到你使用int min = Integer.MAX_VALUE來初始化關閉值。 也許您可以使用LongWritable minDay = LongWritable(Long.MAX_VALUE)來解決?

我已經解決了由混疊引起的問題。

而不是做maxDay = tempDate; 現在maxDay指向tempDate對象,我應該調用方法.set()

解決方案:

maxDay.set(tempDate.get());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM