2017-10-26 5 views
0

タイトルをうまく言えないという謝罪。私は提案に開放されています。変数の割り当てと関数シグネチャの出力を理解するのが難しい

私は逆のインデックスを作成しようとしていますが、それぞれの単語に対してこの単語を記述する記事のリストを作成しようとしています。ここでは以下の私のコードだ:

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 
    } 

を私は署名がドン」エラーが出ますtマッチ。私がここで紛失しているものはありますか?

出力の種類は一見すると同じであると仮定します。おそらく、底バージョンの.groupByKeyがflatMapの一部として適用されていますか?

答えて

3
rdd flatMap { ... }.groupByKey 

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

として解析されていますが、これは期待される動作である

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

をしたい:あなたが行うとき、これをしたい

1 + something.foo 

と言うが、それは取得しますときに従うことは少し難しいsomethingはここのような大きな表現です。

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

私はこのケースでは、私はむしろforを使用したい、仕事れる

rdd.flatMap { ... }.groupByKey 

を書くことが好きですが、

関連する問題