2017-06-05 1 views
0

Je m'entraînais avec l'étincelle apache et j'ai essayé de faire quelques calculs. Bien que, j'ai pu réaliser mon résultat désiré, mais j'ai dû essayer deux méthodes différentes avant que cela fonctionne.Filtrage du jeu de données de calcul RDD

J'ai un jeu de données existant dont j'ai créé un RDD.

« RT @NigeriaNewsdesk: écolières Chibok swappée pour 5 commandants de Boko Haram via @todayng »

je voulais filtrer et d'obtenir les mots qui commence par @ donc je créé un RDD à partir d'un ensemble de données existant.

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

J'ai quelque chose comme ça

[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' 

Je vais aussi attacher First Result Sur la deuxième tentative, je l'ai fait quelque chose comme ça

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") 

La deuxième tentative a travaillé tout à fait bien, mais ma question est pourquoi ai-je dû le diviser avant de paralléliser l'ensemble de données?

Puis-je réaliser la même chose sans le faire d'abord?

tweets = tweets.split(" ") 

Merci.

Répondre

1

carte Situé juste directement comme ceci:

import re 

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

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

Il ne devient pas plus simple que ça :)