Я играю & learning hadoop MapReduce.hadoop mapreduce: обработка текстового файла с заголовком
Я пытаюсь отобразить данные из VCF файла (http://en.wikipedia.org/wiki/Variant_Call_Format): а VCF является табуляцией файла, начиная с (возможно большим) заголовком. Этот заголовок необходим для получения семантики записей в теле.
Я хотел бы создать Mapper, который будет использовать эти данные. Заголовок должен быть доступен из этого Mapper для декодирования строк.
С http://jayunit100.blogspot.fr/2013/07/hadoop-processing-headers-in-mappers.html, я создал этот InputFormat, с настраиваемым чтением:
public static class VcfInputFormat extends FileInputFormat<LongWritable, Text>
{
/* the VCF header is stored here */
private List<String> headerLines=new ArrayList<String>();
@Override
public RecordReader<LongWritable, Text> createRecordReader(InputSplit split,
TaskAttemptContext context) throws IOException,
InterruptedException {
return new VcfRecordReader();
}
@Override
protected boolean isSplitable(JobContext context, Path filename) {
return false;
}
private class VcfRecordReader extends LineRecordReader
{
/* reads all lines starting with '#' */
@Override
public void initialize(InputSplit genericSplit,
TaskAttemptContext context) throws IOException {
super.initialize(genericSplit, context);
List<String> headerLines=new ArrayList<String>();
while(super.nextKeyValue())
{
String row = super.getCurrentValue().toString();
if(!row.startsWith("#")) throw new IOException("Bad VCF header");
headerLines.add(row);
if(row.startsWith("#CHROM")) break;
}
}
}
}
Теперь в Mapper, есть способ, чтобы иметь указатель на VcfInputFormat.this.headerLines
для того, чтобы декодировать линии?
public static class VcfMapper
extends Mapper<LongWritable, Text, Text, IntWritable>{
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
my.VcfCodec codec=new my.VcfCodec(???????.headerLines);
my.Variant variant =codec.decode(value.toString());
//(....)
}
}
вы имеете в виду, что каждая строка из моего файла будет вставлять весь заголовок? – Pierre
Нет, я имею в виду каждый раз, когда строка будет передана вашему картографу, она предварительно закодирована в 'RecordReader' как объект' my.VcfCodec'; это означает, что объект «Text» действительно не передается в Mapper, а вместо него - объект my.VcfCodec. Таким образом, нет необходимости в доступе и передаче заголовков к картографу, поскольку информация поступает уже в кодировщик. – frb
Я отредактировал, потому что параметр 'value' в методе' map' был неправильного типа. Сожалею. – frb