私が使用している入力ファイルのパーティションの行インデックスを知る必要があります。私は行インデックスをデータに連結することでこれを元のファイルに強制することができますが、私はむしろHadoopでこれを行う方法を持っています。私はこれを私のマッパに持っています...Hadoopで入力ファイルのパーティションIDを取得する
String id = context.getConfiguration().get("mapreduce.task.partition");
"id"はどの場合でも0です。 「Hadoop:The Definitive Guide」では、パーティションIDのようなアクセスプロパティに「MapperまたはReducerのすべてのメソッドに渡されるコンテキストオブジェクトからアクセスできます」という記述があります。私が知る限り、この情報にアクセスする方法は実際にはありません。
私はContextオブジェクトのドキュメンテーションを調べましたが、これはそのようにしてスクリプトがコンパイルされるようです。しかし、私はすべての価値について0を得ているので、私は実際に正しいことを使っているかどうか分からず、これを理解するのに役立つオンラインの詳細を見つけることができません。
コードをテストするために使用される...
public class Test {
public static class TestMapper extends Mapper<LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String id = context.getConfiguration().get("mapreduce.task.partition");
context.write(new Text("Test"), new Text(id + "_" + value.toString()));
}
}
public static class TestReducer extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for(Text value : values) {
context.write(key, value);
}
}
}
public static void main(String[] args) throws Exception {
if(args.length != 2) {
System.err.println("Usage: Test <input path> <output path>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(Test.class);
job.setJobName("Test");
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(TestMapper.class);
job.setReducerClass(TestReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
私は明確ではありません「入力ファイルのパーティションの行インデックス」が実際に何を意味するのかを示します。明確にできますか? –
@BinaryNerd間違っているかもしれませんが、入力ファイルの行IDと思っていました。ファイル内に100行がある場合は、現在の行がマッパーが作業していることを知りたいと考えています(0-99または1-100の番号) – cpd1