2017-06-05 59 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)) 

它没有什么比这更简单的:)