2017-10-21 1 views
0

Ich habe die folgende Reducer KlasseHadoop Reducer Individuelle Beschreibbare

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); 
} 
} 

Mein Datensatz wird in folgendem Format:

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

Zum Beispiel:

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

Ich bin zu schreiben gefragt ein neues MapReduce-Programm, das für jedes Unternehmen die Anzahl der Jahre, in denen es an der Börse präsent war, und die maximale und minimale Anzahl von Cl angibt durch den Bestand erhaltener Wert.

Mein Programm erzeugt die korrekte Ausgabe aber das Startdatum ist aus irgendeinem Grunde konstant:

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 

Die DateClosePair ist ein Kunde Beschreibbare ich wie jedes Beispiel schrieb man im Internet finden würde.

Es ist sehr seltsam, dass der min_closing-Preis und der max_closing-Preis korrekt sind, aber das mix_date und max_date falsch sind.

Irgendwelche Gedanken?

Antwort

0

Ich habe das Problem gelöst, das durch Aliasing verursacht wird.

Statt maxDay = tempDate; zu tun, wo jetzt maxDay zum tempDate Objekt zeigt, sollte ich die Methode .set() nennen.

Lösung:

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

LongWritable minDay = new LongWritable() initialisiert Ihre Mindestdatumsvariablen bis 1970.

Genauer gesagt: es sei denn, einen bestimmten Wert gegeben, LongWritable seine internen long-0 gemäß dem java language spec initialisiert. Wenn dies in java.util.Date eingegeben wird, wird es als 0 Millisekunden von Unix-Epoche interpretiert: January 1, 1970, 00:00:00 UTC.

Meine Schätzung ist, dass 1970 eine untere Grenze für alle Datumswerte in Ihrem Dataset ist. Dies würde es für jeden Schlüssel schreiben.

Ich bemerkte, dass Sie int min = Integer.MAX_VALUE verwenden, um den Schließwert zu initialisieren. Vielleicht könnten Sie stattdessen verwenden, um zu lösen?

+0

Ich habe darüber nachgedacht, diese Lösung. Wenn ich 'LongWritable' ändere, um mit' Long.MAX_VALUE/MIN_VALUE' instanziiert zu werden, bekomme ich den gleichen Wert für min_day und max_day. So sieht die Ausgabe so aus: '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

Interessant. Ist Ihr Aliasing-Problem dann mit [der Wiederverwendung von Schlüssel/Wert-Objekten] verbunden? (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)) in der Reduce-Funktion? Es scheint frustrierend, dass (nach meinem Wissen) nur die Version 2.8.0 von Apache Docs diese Tatsache enthält, obwohl frühere Versionen es auch implementiert haben. –

+0

Es sieht so aus, als ob die Wiederverwendung der Writable-Objekte das Alias-Problem verursacht hat, als ich sie mit Aliasing versehen habe, anstatt Werte zu übergeben.Ich bin neu in Hadoop, so kann ich nicht jeden tieferen Grund denken, wenn die Verwendung der Setter-Methode scheint meine Fehler zu lösen. – AthanGkanos

Verwandte Themen