次のようにフォーマットされた大きなファイルがあります
sample name \t index \t score
Hadoop Streaming を使用して、サンプル名に基づいてこのファイルを分割しようとしています。サンプルの数が事前にわかっているので、必要なレデューサーの数を指定できます。この投稿は非常に似たようなことをしているので、これが可能であることはわかっています。
以下のスクリプトを使って、このファイルを 16 個のファイルに分割してみました (サンプルは 16 個あります)。
hadoop jar $STREAMING \
-D mapred.text.key.partitioner.options=-k1,1 \
-D stream.num.map.output.key.fields=2 \
-D mapred.reduce.tasks=16 \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-mapper cat \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-input input_dir/*part* -output output_dir
これはある程度機能します - 一部のファイルにはサンプル名が 1 つしか含まれていません。ただし、ほとんどの part* ファイルは空白で、一部の part* ファイルには複数のサンプル名が含まれています。
すべてのレデューサーが 1 つのサンプル名のみを取得するようにするためのより良い方法はありますか?