2017-06-05 2 views
0

Ich war mit Apache Funken üben und ich habe versucht, einige Berechnungen. Obwohl ich mein gewünschtes Ergebnis erreichen konnte, musste ich zwei verschiedene Methoden ausprobieren, bevor es funktionierte.Filter RDD Berechnung Datensatz

Ich habe einen vorhandenen Datensatz, aus dem ich eine RDD erstellt habe.

„RT @NigeriaNewsdesk: Chibok Schülerinnen wurden getauscht für 5 Boko Haram Kommandanten über @todayng“

Ich wollte die Worte filtern und zu erhalten, die mit @ beginnt, so dass ich eine RDD aus einem vorhandenen Dataset erstellt.

usernameFile = sc.parallelize(tweets) 
username = usernameFile.flatMap(lambda line: line.split()).filter(lambda x: x.startswith('@')).collect() 
print(username) 

Ich habe so etwas wie dieses

[u'R', u'T', u' ', u'@', u'N', u'i', u'g', u'e', u'r', u'i', u'a', u'N', u'e', u'w', u's', u'd', u'e', u's', u'k', u':', u' ', u'C', u'h', u'i', u'b', u'o', u'k', u' ', u's', u'c', u'h', u'o', u'o', u'l', u'g', u'i', u'r', u'l', u's', u' ', u'w', u'e', u'r', u'e', u' ', u's', u'w', u'a', u'p', u'p', u'e', u'd', u' ', u'f' 

Ich werde es auch Auf dem zweiten Versuch First Result befestigen, ich so etwas wie dieses

tweets = tweets.split(" ") 
usernameFile = sc.parallelize(tweets) 
username = usernameFile.flatMap(lambda line: line.split()).filter(lambda x: x.startswith('@')).collect() 
print(username) 
print("username done") 

absolut in Ordnung Der zweite Versuch gearbeitet hat, Aber meine Frage ist, warum musste ich es teilen, bevor ich den Datensatz parallelisierte?

Kann ich dasselbe erreichen, ohne dies zuerst zu tun?

tweets = tweets.split(" ") 

Vielen Dank.

Antwort

1

Karte einfach direkt wie folgt aus:

import re 

tweets = sc.parallelize([ 
    "RT @foo abc @bar" 
]) 

tweets.flatMap(lambda s: re.findall("@\w+", s)) 

es nicht einfacher bekommt als das :)

Verwandte Themen