PySpark地图不起作用

时间:2016-07-30 23:16:32

标签: apache-spark mapreduce pyspark

我是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中没有任何内容。功能情绪根本没有被调用。 有人可以指出错误

1 个答案:

答案 0 :(得分:2)

您无法在map中的Apache Spark转换中更改全局变量的值以实现此目的,您需要Accumulator,但即使使用它们,我认为这不是正确的做法。

如果您的pos_wordsneg_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:如果你的想法是计算每条消息的正面和负面词,那么这种方法会略有不同。