难以理解变量赋值和函数签名输出

时间:2017-10-26 03:58:47

标签: scala apache-spark

道歉,因为无法更好地说出标题。我愿意接受建议。

我试图制作一个倒排索引,对于每个单词,我试图生成一个提到这个单词的文章列表。这是我的代码:

def makeInvertedIndex(words: List[String], rdd: RDD[Article]): RDD[(String, Iterable[Article])] = {
  val foo = rdd flatMap { article =>
    words.map { lang =>
      (word, article)
    }.filter(pair => pair._2.mentionsWord(pair._1))
  }
  foo.groupByKey
}

上面的函数按预期返回RDD[(String, Iterable[Article])]类型,但如果我要重写函数如下:

  def makeInvertedIndex(words: List[String], rdd: RDD[Article]): RDD[(String, Iterable[Article])] = {
    rdd flatMap { article =>
      words.map { lang =>
        (word, article)
      }.filter(pair => pair._2.mentionsWord(pair._1))
    }.groupByKey
  }

我收到一个错误,签名不匹配。我有什么东西在这里失踪吗?

我认为乍一看输出类型是一样的。也许底部版本中的.groupByKey是作为flatMap的一部分应用的?

1 个答案:

答案 0 :(得分:3)

rdd flatMap { ... }.groupByKey

被解析为

rdd.flatMap({...}.groupByKey)

但你想要

rdd.flatMap({...}).groupByKey

这是预期的行为:你想要这样做,比如说

1 + something.foo

但是当something是一个大表达式时,它会变得有点难以理解,就像这里一样。

我喜欢写

rdd.flatMap { ... }.groupByKey

哪个会起作用,但在这种情况下,我宁愿使用for

(for {
   article <- rdd
   word <- words
   if article.mentionsWord(word)
 } yield (word, article)
).groupByKey