2016-06-13 14 views
0

Ich versuche tatsächlich, einen Mapper und Reducer mit Python für bestimmte Daten zu entwickeln. Ich habe den Mapper-Code geschrieben, der den Namen des Geschäfts und die Kosten der Transaktion geben würde, die im Laden gemacht wurde.Vergleichen mehrerer Werte zu einem Schlüssel in Python

Zum Beispiel:

Nike $45.99 Adidas $72.99 Puma $56.99 Nike $109.99 Adidas $85.99

Hier ist der Schlüssel der Speichername und der Wert die Kosten der Transaktion. Jetzt versuche ich den Reducer-Code zu schreiben, der die Transaktionskosten in jedem Geschäft vergleichen und die höchste Transaktion in jedem Geschäft geben würde.

Nun ist die Ausgabe, die ich will bekommen, ist

Nike $109.99 Adidas $85.99 Puma $56.99

Meine Frage ist, wie kann ich die verschiedenen Werte zu einem Schlüssel in Python gegeben vergleichen?

+0

Wie werden Ihre Daten formatiert? Wird es in ein Diktat geladen, wird es in einer TXT-Datei gespeichert usw.? – TheLazyScripter

+0

Es wird in einer Textdatei gespeichert, die ich später importieren würde. – Praneeth

Antwort

1

Nun, das MapReduce Paradigma ist ein Schlüssel-Wert-Paare, die jeder Mapper im exakten Format ausgeben sollte.

Wie beim Reducer, garantiert das Hadoop-Framework, dass jeder Reducer, der einen Shuffle-Sort-Algorithmus verwendet, alle Werte für einen bestimmten Schlüssel erhält. Es gibt also keine Möglichkeit, dass zwei verschiedene Reducer unterschiedliche Einträge vom selben Schlüssel erhalten.

Ein Reduzierer kann jedoch mehrere Schlüsselwerte verarbeiten.

Was Ihre Frage, lassen Sie uns annehmen, dass Sie drei verschiedene Werte für den gleichen Schlüssel haben, zum Beispiel:

Nike $109.99 
Nike $45.99 
Nike $294.99 

Das Reduktionsmittel wird zunächst 2-Werte erhalten, so dass Ihre Minderer Funktion basiert auf dem Schlüssel wird die bekommen Werte:

  • $109.99
  • $45.99

und benötigen sollten die höchste mit einfachen Vergleich zum Ausgang und der Ausgang $109.99 sein, die der Eingang zum 2. Mal laufen wird Ihre Minderer Funktion diesmal mit dem Eingang sein wird:

  • $109.99
  • $294.99

Und wieder den Vergleich mit Ihnen den höchsten Wert Ausgang sollte, nämlich: $294.99

Wie für den Code, müssen Sie eine sehr einfache Funktion, so etwas wie:

EDIT: Ich nehme an, Ihre Trennzeichen Tab ist, aber Sie können das Format ändern, was auch immer Sie verwenden

#!/usr/bin/env python 

import sys 

current_word = None 
current_max_count = 0 
word = None 

# input comes from STDIN 
for line in sys.stdin: 
    # remove leading and trailing whitespace 
    line = line.strip() 

    # parse the input we got from mapper.py 
    word, count = line.split('\t', 1) 

    # convert count (currently a string) to int 
    try: 
     count = int(count) 
    except ValueError: 
     # count was not a number, so silently 
     # ignore/discard this line 
     continue 

    # this IF-switch only works because Hadoop sorts map output 
    # by key (here: word) before it is passed to the reducer 
    if current_word == word: 
     if count > current_max_count: 
      current_max_count = count 
    else: 
     if current_word: 
      # write result to STDOUT 
      print '%s\t%s' % (current_word, current_max_count) 
     current_max_count = count 
     current_word = word 

# do not forget to output the last word if needed! 
if current_word == word: 
    print '%s\t%s' % (current_word, current_max_count) 
+0

Danke für die Hilfe Avihoo – Praneeth

0
def largets_value(_dict): 
    d = {} 
    for i, v in enumerate(_dict.keys()): 
     d[v] = max(_dict.values()[i]) 
    return d 

def dict_from_txt(file, sep): 
    d = {} 
    f = [x.rstrip().replace('$', '').split(sep) for x in open(file, 'rb').readlines()] 
    for i in f: 
     if i[0] in d: 
      d[i[0]].append(float(i[1])) 
     else: 
      d[i[0]] = [float(i[1])] 
    return d 

def dict_from_iterable(iterable, sep): 
    d = {} 
    f = [x.rstrip().replace('$', '').split(sep) for x in iterable] 
    for i in f: 
     if i[0] in d: 
      d[i[0]].append(float(i[1])) 
     else: 
      d[i[0]] = [float(i[1])] 
    return d 

data = ['Nike $45.99', 
     'Adidas $72.99', 
     'Puma $56.99', 
     'Nike $109.99', 
     'Adidas $85.99'] 
print largets_value(dict_from_iterable(data, ' ')) 
#Uncomment next line and delete the previous to use for yourself 
#print largets_value(dict_from_txt('my_file', ' ')) 
0

Hadoop sollte die Ausgabe Ihres Mappers sortieren, bevor Sie sie an Ihre Reduzierungen übergeben. Vorausgesetzt, dass Sie itertools.groupby() gruppieren wie Schlüssel in eine Liste verwenden können, und wählen Sie dann die größte von jeder gruppierte Liste:

#!/usr/bin/env python 

import sys 
from itertools import groupby 

for store, transactions in groupby((line.split() for line in sys.stdin), 
            key=lambda line: line[0]): 
    print(store, max(float(amount[1].replace('$', '')) for amount in transactions)) 

Dies setzt natürlich voraus, dass der Ausgang des Mapper von zwei weißen Raum getrennte Felder für Speicher besteht und Transaktionswert.

Verwandte Themen