java - Hadoop Reducer 自定义可写

标签 java apache hadoop mapreduce 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_closing price 和 max_closing price 是正确的,但是 mix_date 和 max_date 是错误的。

有什么想法吗?

最佳答案

LongWritable minDay = new LongWritable() 将您的最小日期变量初始化为 1970。

更准确地说:除非给定一个特定的值,否则 LongWritable 会根据 java language spec 将其内部 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) 来解决?

关于java - Hadoop Reducer 自定义可写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46868902/

相关文章:

hadoop - 在 Spark Streaming 中更改输出文件名

java - Spring @ModelAttribute 不应该将属性添加到 View 中吗?

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

php - NodeJS 比 PHP 慢很多?

php - 管理员找不到 PHP 扩展

hadoop - 如何在使用 Impala 从 Tableau 连接 Hive 表元数据时刷新它

java - 在不破坏布局的情况下隐藏 JPanel

Java - 扫描仪 - 跳过我的最后一个 nextLine() 请求

regex - 在 AliasMatch 上找不到 DirectoryIndex

hadoop - mapreduce 中的压缩文件 VS 未压缩文件。哪个性能更好?