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.
Sie könnten versuchen, indem Sie die Elemente in MapReduce Wikipedia-Artikel berücksichtigen:
[key, value]
pair von Ihren Eingabe-Hashes. map
worker nur das [key, value]
-Paar zurückgibt, das er als Eingabe erhalten hat key.hash % REDUCER_COUNT
sein. [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). Und hier ist meine (über) vereinfachte Umsetzung der oben genannten.
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:
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)
:
oder
%Vor% Dieser Code verwendet die Methoden map
und reduce
von Ruby, aber das alles direkt auf einem Hash zu tun wäre viel eleganter.
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]]
:
Ich liebe Rubin für diese One Liners!