使用scala计算与spark相关的共现项

时间:2017-05-05 06:15:29

标签: scala apache-spark

我想用scala计算共同出现的术语。 但我遇到了一些问题。

这是我的代码:

val path = "pg100.txt"
val words = sc.textFile(path).map(_.toLowerCase.split("[\\s*$&#/\"'\\,.:;?!\\[\\](){}<>~\\-_]+").map(_.trim).sorted)
val coTerm = words.map{ line =>
    for{ 
        i <-0 until line.length
        j <- (i+1) until line.length
    } {
        ((line(i), line(j)), 1)
    }}  

预期输出应为:

coTerm.collect
res48: Array[Unit] = Array(((word1, word2), 1), ((word1, word3), 1), ((word2, word3), 1)...

但我的输出如下:

coTerm.collect
res51: Array[Unit] = Array((), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), (), ()....

我不知道为什么我可以在.map中使用println函数来打印单词对但不能发出输出。

1 个答案:

答案 0 :(得分:2)

原因是您实际上没有从您map返回任何记录。

使用yield返回for中的记录,如下所示:

val coTerm = words.map{ line =>
for{ 
    i <-0 until line.length
    j <- (i+1) until line.length
} yield {
    ((line(i), line(j)), 1)
}}