处理多条线路'在apache-spark RDD中

时间:2015-03-02 15:11:00

标签: apache-spark rdd

我对Spark很新,我有一个问题。

我尝试用一​​些数据进行简单的情绪分析。 在数据文件中,每一行都包含产品评论。

这是我处理一行的代码:

// wordlist
val pos_file = "/user/cloudera/Data/pos_list.txt"
val neg_file = "/user/cloudera/Data/neg_list.txt"

val pos_words = sc.textFile(pos_file).cache().collect().toSet
val neg_words = sc.textFile(neg_file).cache().collect().toSet


val test_string = "Line with positive or negative review."
val test_rdd = sc.parallelize(List(test_string))

val test_rdd2 = test_rdd.flatMap(line => "[a-zA-Z]+".r findAllIn line map (_.toLowerCase) )

val pos = test_rdd2.filter(x => pos_words contains x)
val neg = test_rdd2.filter(x => neg_words contains x)

我现在的问题是如何处理rdd中的每条记录(在本例中为3):

val file_in = "/user/cloudera/Data/teststring.txt"
val data = sc.textFile(file_in).cache()
val reviews = data.flatMap(_.split("\n"))

scala> reviews.count()
res29: Long = 3

以下代码

val reviews2 = reviews.flatMap(line => "[a-zA-Z]+".r findAllIn line map (_.toLowerCase))

给了我所有的话。 我想获得每行/评论的pos和neg的值。 计算非常简单:如果一个单词位于一组pos_words / neg_words中,则将其置于pos / neg中。实际上,我只计算正面或负面词语的出现。

我如何得到类似的东西(' line',' posvalue',' negvalue')?

非常感谢提前

1 个答案:

答案 0 :(得分:0)

试图总结一下这个问题:我们想要计算输入文件的每一行上某些单词(正面,负面)的出现次数,然后才能进行标准化':所有字母字符和空格小写。

让我们假设我已经有两套正面和负面的词:

val posWords: Set[String] = ???
val negWords: Set[String] = ???

输入文件,每行1条记录:

val data = sc.textFile("data.txt")

我们想要一个表格的结果:

(text, posCount, negCount)

让我们首先定义一个辅助函数,让我们计算String序列中的单词与一组字符串的匹配:

def matches(text:Seq[String], words:Set[String]):Int =
text.map(w => if (words.contains(w)) 1 else 0).sum 

最后,我们将每一行转换为正负匹配的计数。

val posNegData  = data.map{line => 
    val cleanLine = line.toLowerCase.split("\\W")
    (line, matches(cleanLine, posWords), matches(cleanLine, negWords))
}

这里我们假设预期结果是具有正负匹配的原始字符串。 (原始问题不清楚)