【问题标题】:Scala combination function issueScala组合函数问题
【发布时间】:2018-09-19 17:43:36
【问题描述】:

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

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 双,但错过了其中两双:(by,shakespeare)(william,shakespeare)。我觉得第一句话的最后一个字可能有问题,但我不知道如何解决,谁能告诉我?

【问题讨论】:

  • 欢迎来到 StackOverflow。请避免发布图像,而是将代码以文本形式发布,并通过选择代码并按 Ctrl + K 对其进行格式化。您也可以阅读How to Ask 了解更多信息。记得提供minimal reproducible example
  • 使用combinations,您将获得(by,shakespeare)(shakespeare,by),而不是两者。

标签: scala apache-spark rdd


【解决方案1】:

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

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

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

这里是tails方法的描述:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多