我有一个制表符分隔的输入文件,我在Map-Reduce中读取2列。 1列是键,另一列是值。所以我的要求是,如果值为空,即它包含空格或制表符或任何其他字符,即使该键也不应该被处理到reducer。整体而言,它应该丢弃该记录并获取具有值的下一条记录。编写了以下代码,但它不起作用。它执行所有记录。它不会过滤任何东西。
public static class Map extends Mapper<LongWritable, Text, Text,Text>
{
private Text vis = new Text();
private Text eValue = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException
{
String line=value.toString();
String[] arr=line.split("\t");
vis.set(arr[8]);
eValue.set(arr[287]);
if (!eValue.equals("\t") || eValue.equals(" "))
{
context.write(vis,eValue);
}
}
}
感谢任何帮助。提前谢谢。
PS:我正在使用Hadoop-2.6.0
答案 0 :(得分:2)
您可以使用以下语句而不是多个检查条件。
if (!(eValue.toString().isEmpty()))
{
context.write(vis,eValue);
}
答案 1 :(得分:1)
您在设计方面做得很好。但是,我认为if条件不是你所期望的。如果您有空值,首先要了解您在地图中获得的值。一旦你基于'\ t'分裂,你怎么期望它仍然出现在单个词中。再想一想,修改if条件。
答案 2 :(得分:0)
您必须再检查一个条件
eValue.equals( “”)
此外,您的非条件仅适用于 \ t 。您需要将所有条件放在一起(如果您的要求是省略所有带空格/制表符/空的值)。
if (!(eValue.equals("\t") || eValue.equals(" ") || eValue.equals("")))
{
context.write(vis,eValue);
}