我是Apache Spark的新手,以及实现为
的简单地图功能from pyspark import SparkContext
sc = SparkContext( 'local', 'pyspark')
f = open("Tweets_tokenised.txt")
tokenised_tweets = f.readlines()
f = open("positive.txt")
pos_words=f.readlines()
f = open("negative.txt")
neg_words=f.readlines()
def sentiment(line):
global pos_words
global neg_words
pos = 0
neg = 0
for word in line.split():
if word in pos_words:
pos=pos+1
if word in neg_words:
neg=neg+1
if(pos > neg):
return 1
else:
return 0
dist_tweets=sc.textFile("Tweets_tokenised.txt").map(sentiment)
#(lambda line: sentiment(line))
dist_tweets.saveAsTextFile("RDD.txt")
基本上我正在读取一个文件(包含标记和词干推文),然后在map函数中对它进行简单的正负字计数。(从结尾开始的第3行)但RDD.txt中没有任何内容。功能情绪根本没有被调用。 有人可以指出错误
答案 0 :(得分:2)
您无法在map
中的Apache Spark
转换中更改全局变量的值以实现此目的,您需要Accumulator,但即使使用它们,我认为这不是正确的做法。
如果您的pos_words
和neg_words
不是很大,则可以将其定义为Broadcast列表,然后按sentiment
计算。
类似的东西:
pos = sc.broadcast(["good", "gold", "silver"])
neg = sc.broadcast(["evil", "currency", "fiat"])
# I will suppose that every record is a different tweet and are stored in tuples.
tweets = sc.parallelize([("banking", "is", "evil"), ("gold", "is", "good")])
(tweets
.flatMap(lambda x: x)
.map(lambda x: (1 if x in pos.value else -1 if x in neg.value else 0, 1))
.reduceByKey(lambda a, b: a + b).take(3))
# notice that I count neutral words.
# output -> [(0, 3), (1, 2), (-1, 1)]
注意,您可以查看右侧here示例。
PD:如果你的想法是计算每条消息的正面和负面词,那么这种方法会略有不同。