过滤RDD计算数据集

时间:2017-06-05 18:06:43

标签: apache-spark filter rdd flatmap

我正在练习apache spark,我尝试做一些计算。虽然,我能够达到我想要的结果,但我必须在它工作之前尝试两种不同的方法。

我有一个现有的数据集,我从中创建了一个RDD。

“RT @NigeriaNewsdesk:Chibok女学生通过@todayng与5名Boko Haram指挥官交换”

我想过滤并获取以@开头的单词,所以我从现有数据集创建了一个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 个答案:

答案 0 :(得分:1)

直接映射如下:

import re

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

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

它并不简单:)