У меня есть большой файл, который отформатирован следующим образом
sample name \t index \t score
И я пытаюсь разделить этот файл на основе имени примера с помощью Hadoop Streaming. Я заранее знаю, сколько есть сэмплов, поэтому могу указать, сколько редукторов мне нужно. Этот post делает что-то очень похожее, поэтому я знаю, что это возможно.
Я попытался использовать следующий скрипт, чтобы разбить этот файл на 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
Это отчасти работает — некоторые файлы содержат только одно имя примера. Однако большинство файлов part* пусты, а некоторые файлы part* содержат несколько названий образцов.
Есть ли лучший способ убедиться, что каждый редуктор получает только одно имя образца?