hadoopで転置インデックス

先週の水曜日に手を上げてやることになっていたhadoopの課題”転置インデックス”を作るというプログラムが、一応完成した。
実行すると、

bedtime : 3 : (5, 2), (6, 1)
bedvow : 1 : (4, 1)
bedward : 1 : (5, 1)
bedwork : 1 : (4, 1)
bee : 8 : (2, 1), (3, 1), (4, 1), (8, 3), (9, 1), (32, 1)
bee's : 1 : (6, 1)
beef : 11 : (1, 1), (4, 2), (5, 1), (6, 2), (7, 1), (8, 2), (10, 2)
beefs : 2 : (5, 1), (8, 1)

てな感じで出力される。
Mapではkeyには単語をText型で、valueにはDocid(今回は何文目かで区切ってあるはず)をIntWritable型で入れている。
Reduceでは単語の総数と各Docidごとに数を数えた。
出力はkeyで単語をText型で、valuesで単語の総数とDocidごとの単語の数を並べてこちらもText型で出力した。
MapとReduceがあるのはわかるんだが、実は間にCombinerというものがある
らしくそこがわからず、ずっと手こずっていた。
Javaとかオブジェクト指向はよくわからないんだが(頑張って習得します!)、このCombinerというのはReduceのクラス(?)を継承しているらしくそこでずっとエラーがでていた。
ということで、今回はこのCombinerを使わずに作っている。
このことについては
http://www.mail-archive.com/core-user@hadoop.apache.org/msg01339.html
http://www.ne.jp/asahi/hishidama/home/tech/apache/hadoop/Combiner.html
に書いてあったんだが、
Mapperの出力を受け取りReducerへ渡すという仕様なので、Combinerの入力型はMapperの出力型と等しく、Combinerの出力型はReducerの入力型と等しくなければならない。
らしい。
ようするに、
(MapOutput型 = ReduceInput型)
MapOutput型 = CombinerInput型
CombinerOutput型 = ReduceInput型
かつ、CombinerはReduceのクラスを継承しているので
ReduceInput型 = CombinerInput型
ReduceOutput型 = CombinerOutput型
でなければならない。よって、Combinerを使う場合は(もちろん使わなければ成り立たない)
ReduceInput型 = ReduceOutput型 = CombinerInput型 = CombinerOutput型
という風になってしまう。
ちなみにこの課題では、
Mapper
Reducer
としたので、Combinerを作った場合は
Combiner
となり、Reduceの入力(Text, IntWritable)とCombinerの出力(Text, Text)が違う形になっていて自分はここでエラーが出て失敗した。
Combinerを使うならば、
Mapper
Reducer
Combiner
にすれば大丈夫かな。