ein Problem mit Map Reduce lösen

8

Ich möchte in Ruby meine Implementierung der Funktionen map und reduce für ein System wie hadoop simulieren, um zu bestätigen, dass die Idee zumindest funktioniert.

Ich habe das folgende Problem. Ich habe zwei Listen von Elementen:

%Vor%

Ich muss eine allgemeine Liste erstellen, die die Summe der Zahlen enthält, die den in den beiden Listen üblichen Alphabeten zugeordnet sind:

%Vor%

Ich möchte ein Ruby-Skript mit den Operationen map und reduce erstellen, um dieses Problem zu lösen. Ich bin mir nicht sicher, wie ich dieses Problem angehen soll oder welche Vorgehensweise ich anwenden muss, um dies in einem Ruby-Skript zu simulieren.

Jede Hilfe wird geschätzt.

    
Flethuseo 10.04.2011, 15:01
quelle

4 Antworten

2

Sie könnten versuchen, indem Sie die Elemente in MapReduce Wikipedia-Artikel berücksichtigen:

  • ein Eingabe-Reader - in Ihrem Fall wäre das wahrscheinlich ein Methodenaufruf auf [key, value] pair von Ihren Eingabe-Hashes.
  • eine Map-Funktion - Sie haben bereits Schlüssel, mit denen Sie Ihre Daten verarbeiten sollten, sodass Ihr map worker nur das [key, value] -Paar zurückgibt, das er als Eingabe erhalten hat
  • eine Partitionsfunktion - eine Methode, die basierend auf dem Schlüssel einen reduzierenden Worker zuweisen würde. In Ihrem Fall könnte es einfach key.hash % REDUCER_COUNT sein.
  • eine Vergleichsfunktion - ich denke nicht, dass dies in Ihrem Fall anwendbar ist, da Sie keine Werte benötigen, die in einer bestimmten Reihenfolge verarbeitet werden.
  • eine Reduce-Funktion - würde [key, list] pair geben, Liste ist eine Liste von Werten, die dem Schlüssel zugeordnet sind. Es würde die Summe von list zurückgeben, wenn die Liste mehr als ein Element lang ist (da nur Elemente in beiden Eingabehashes verarbeitet werden sollen).
  • ein Ausgabe-Writer - könnte in Ihrem Beispiel einfach Hash sein.

Und hier ist meine (über) vereinfachte Umsetzung der oben genannten.

    
Mladen Jablanović 10.04.2011, 18:02
quelle
2

Unter der Annahme, dass alle anderen Map-Reduce-bezogenen Funktionen implementiert sind (Eingabe-Leser, Ausgabe-Writer, globale Sortierung, ...), wären dies die map und reduce one:

%Vor%

Die Funktion map wird yield ein Paar (letter, count) , die später gruppiert werden. Dann wird für jedes letter erhalten von map s reduce ein Array erhalten, das jede von einem map für dieses letter erhaltene Zählung enthält. Da Sie nur ausgeben möchten, wenn der Buchstabe auf beiden Hashes auftritt, müssen Sie count s zweimal in partial_counts eingeben, um die Summe am Ende zu berechnen. Die Funktion reduce könnte auf verschiedene Arten implementiert werden. Ich habe versucht, es so einfach wie möglich zu machen, um zu verstehen, obwohl die Implementierung sehr an dieses Problem angepasst ist.

Wenn Sie diese map - und reduce -Implementierung verwenden, wird der letzte Hashwert mit den Schlüsselwerten und dem invertierten Wert zurückgegeben, was sinnvoller ist, da es mehrere Buchstaben mit derselben Anzahl geben kann. Die Eingabe wäre besser, wenn sie auch Schlüssel und Werte invertiert. Auf diese Weise wäre map so einfach wie jedes Paar (letter, count) :

%Vor%

oder

%Vor%     
Ricardo Panaggio 10.04.2011 18:15
quelle
2
%Vor%

Dieser Code verwendet die Methoden map und reduce von Ruby, aber das alles direkt auf einem Hash zu tun wäre viel eleganter.

    
Christoph Petschnig 10.04.2011 19:30
quelle
2

Mit irb (ruby-1.9.2-p180):

%Vor%

Diese Lösung arbeitet mit mehreren Arrays (2+), sie findet gemeinsame Schlüssel und addiert sie zu einem Hash der Ergebnisse

um gemeinsame Schlüssel zu finden (Schlüssel sammeln und gemeinsamen Teil finden):

%Vor%

um die Summe für den Schlüssel zu finden (Werte mit den Tasten auswählen und addieren):

%Vor%

um Hash aus einem Array von Paaren zu erstellen [[:a,9], [:b,4]] :

%Vor%

Ich liebe Rubin für diese One Liners!

    
mpapis 10.04.2011 21:52
quelle

Tags und Links