道歉,因为无法更好地说出标题。我愿意接受建议。
我试图制作一个倒排索引,对于每个单词,我试图生成一个提到这个单词的文章列表。这是我的代码:
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的一部分应用的?
答案 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