如果值为空,如何忽略Map-Reduce中的键值对?

时间:2015-06-11 11:33:57

标签: java hadoop if-statement mapreduce yarn

我有一个制表符分隔的输入文件,我在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

3 个答案:

答案 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);
 }