由于映射器函数针对每一行运行,我是否可以知道如何跳过第一行。对于某些文件,它包含我想忽略的列标题
答案 0 :(得分:8)
在读取文件时,在映射器中,数据作为键值对读入。关键是下一行开始的字节偏移量。对于第1行,它始终为零。所以在mapper函数中执行以下操作
@Override
public void map(LongWritable key, Text value, Context context) throws IOException {
try {
if (key.get() == 0 && value.toString().contains("header") /*Some condition satisfying it is header*/)
return;
else {
// For rest of data it goes here
}
} catch (Exception e) {
e.printStackTrace();
}
}
答案 1 :(得分:1)
由于文件可以存储在多个节点中,我们不能说在哪个机器中存在标题部分以及哪个映射器正在处理该部分文件。 我们可以过滤掉Mapper本身的标题。为此你必须知道标题。例如
String[] cols= line.tokenize();
if(cols[0].equals("header")) {
// skip
} else {
// emit
}