2017-06-05 88 views
0

我正在練習apache的火花,我試着做一些計算。雖然,我能夠達到我想要的結果,但在它工作之前,我不得不嘗試兩種不同的方法。過濾RDD計算數據集

我有一個現有的數據集,我創建了RDD。

「RT @NigeriaNewsdesk:Chibok女生被換成了通過@todayng 5名博科哈拉姆指揮官」

我想過濾,並能獲得我從現有數據集的創建RDD以@開頭的話。

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

我有這樣的事情

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

我也將其附加First Result 在第二次嘗試,我做過這樣的事情

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

第二次嘗試的工作精絕,但我的問題是爲什麼我必須在並行化數據集之前將其分開?

我可以在不先做這件事的情況下達到同樣的效果嗎?

tweets = tweets.split(" ") 

謝謝。

回答

1

就直接映射這樣的:

import re 

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

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

它沒有什麼比這更簡單的:)