2016-04-13 10 views
0

Ich bin ziemlich neu zu funken, habe ich eine Aufgabe, Top hundert Wörter aus einer Reihe von Tweets für jedes Zeichen aus kleinen Alphabeten zu bekommen. zum BeispielSuche Top 100 Wörter für jedes Zeichen pyspark

a: (word1, count1), (word2, count2).. (word100, count100) 
b: (word1, count1), (word2, count2).. (word100, count100) 
. 
. 
z: (word1, count1), (word2, count2).. (word100, count100) 

Dies ist mein Code:

words_mapped = (en_text.flatMap(lambda x: x.split()) 
         .filter(lambda x: x[0] in valid_chars) 
         .map(lambda x: (x[0], x))) 

Dieses ein Tupel mit Charakter und dem Wort, das ich habe diese Zeichen Gruppe, jetzt gibt und die Anzahl der jedes Wort in Werte finden und zeigen die top 100 Wörter mit ihrer Zählung.

Wie kann ich dies in pyspark übersetzen.

+0

was meinst du mit „Charakter“ – Natecat

+0

@ Natecat Ich habe die Frage, Charakter von kleinen Aphabets aktualisiert, siehe auch das Beispiel –

Antwort

1

Spark erleichtert das Aggregieren von (Schlüssel-, Wert-) Paaren. Hier haben Sie zwei Stufen - in der ersten Stufe ist Ihr Schlüssel (Zeichen, Wort) und dann in der zweiten Stufe ist Ihr Schlüssel (Zeichen). (Zuerst müssen Sie die Zählungen berechnen; zweitens müssen Sie die wichtigsten finden.)

Die erste ist ziemlich einfach mit reduceByKey (docs).

words_counted = words_mapped.map(lambda x: (x, 1)) 
          .reduceByKey(add) 

Jetzt müssen wir zu den Top 100 filtern nach unten Dies ist etwas, Funke ist nicht so gut an, weil sie in mehreren Reihen auf einmal erfordert beschäftigen. Scala hat die TopByKeyfunction, aber das scheint in PySpark noch nicht unterstützt zu werden.

Anstatt also lassen Sie uns Schleife über die Zeichen (zumindest gibt es nur 26) und verwenden takeOrdered (docs) wie folgt:

char = 'a' 
charRDD = words_counted.filter(lambda x: x[0][0]==char).takeOrdered(100, key=lambda x: -x[1]) 

Sie können dann diese Listen als angemessen verketten.

Einige alternative Ansätze: verwenden partitionBy (docs) jede Gruppe in einer eigenen Partition zu setzen, und dann mapPartitions (docs) den Iterator für jede Gruppe in das entsprechende Objekt (sagen wir, sortieren sie konvertieren und dann die Top-100-Einnahme).

Eine weitere Möglichkeit foldByKey (docs) zu verwenden, mit einer leeren Liste beginnen, das Hinzufügen das nächste Element in die Liste durch binäre Insertion und fallen dann alle Elemente nach dem 100.

+0

skaliert es schön? mag es sinnvoll sein, 26 Zeichen zu durchlaufen, aber wenn wir zum Beispiel 1000 Top-Anfragen von Top-100-Postern finden sollen, wird es Probleme haben, wenn wir zuerst die Top-100-Poster finden und dann ihre Top-1000-Tweets einzeln filtern? –

+0

@AzeemAkhter Wenn Sie words_counted zwischenspeichern, sollte es linear skalieren. Wenn Sie eine sublineare Skalierung wünschen, müssen Sie etwas Klügeres tun. Ich werde den Beitrag bearbeiten, um das zu beschreiben. –

Verwandte Themen