如果值为空,如何忽略map reduce中的键值对?

twh00eeo  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(265)

我有一个制表符分离的输入文件,从那里我在Map减少阅读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

vsdwdz23

vsdwdz231#

你在设计上做得对。然而,如果条件不是你所期望的,我想。如果你有一个空值,首先要了解你在Map上得到了什么值。一旦你根据'\t'分开,你怎么能期望它仍然存在于单个单词中呢。再想一想,修改if条件。

vql8enpb

vql8enpb2#

你得再检查一次
求值等于(“”)
此外,not条件仅适用于\t。您需要将所有条件的值放在一起(如果您的要求是用空格/tab/empty省略所有值)。

if (!(eValue.equals("\t") || eValue.equals(" ") || eValue.equals("")))
    {
            context.write(vis,eValue);
 }
quhf5bfb

quhf5bfb3#

您可以使用下面的语句而不是多个检查条件。

if (!(eValue.toString().isEmpty()))
    {
        context.write(vis,eValue);
    }

相关问题