Scala组合功能问题

时间:2018-09-19 08:57:00

标签: scala apache-spark rdd

我有一个这样的输入文件:

The Works of Shakespeare, by William Shakespeare 
Language: English

我想使用flatMapcombinations方法来获得每行的K-V对。

这就是我的工作

var pairs = input.flatMap{line => 
  line.split("[\\s*$&#/\"'\\,.:;?!\\[\\(){}<>~\\-_]+")
    .filter(_.matches("[A-Za-z]+"))
    .combinations(2)
    .toSeq
    .map{ case array => array(0) -> array(1)}
}

此后我得到了17对,但错过了其中2对:(by,shakespeare)(william,shakespeare)。我认为第一句话的最后一个词可能有问题,但是我不知道如何解决,有人可以告诉我吗?

1 个答案:

答案 0 :(得分:0)

combinations方法将不会给出重复项,即使这些值的顺序相反。因此,您缺少的值已经以其他顺序显示在解决方案中。

此代码将在文本中创建所有有序的单词对。

  for {
    line <- input
    t <- line.split("""\W+""").tails if t.length > 1
    a = t.head
    b <- t.tail
  } yield a -> b

这是tails方法的说明:

  

遍历此可遍历集合的尾部。第一个值是该可遍历集合,最后一个值是一个空的可遍历集合,中间的值是tail连续应用的结果。