【问题标题】:how to ignore key-value pair in Map-Reduce if values are blank?如果值为空白,如何忽略 Map-Reduce 中的键值对?
【发布时间】:2015-06-11 11:33:57
【问题描述】:

我有一个制表符分隔的输入文件,我正在从其中读取 Map-Reduce 中的 2 列。 1 列是键和其他值。所以我的要求是,如果值是空白的,即它包含空格或制表符或任何其他字符,即使键也不应该被处理到减速器。总的来说,它应该丢弃该记录并获取下一条具有价值的记录。已经写了下面的代码,但是还是不行。它执行所有记录。它不过滤任何东西。

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

【问题讨论】:

    标签: java hadoop if-statement mapreduce hadoop-yarn


    【解决方案1】:

    您可以使用以下语句代替多个检查条件。

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

    【讨论】:

    • 我通过使用 getLength >0 得到了结果,但也会尝试一下。谢谢。
    【解决方案2】:

    您在设计方面做得对。但是,if 条件不是您所期望的。首先了解您在地图中获得的值,如果您有一个空白值。一旦你根据 '\t' 进行拆分,你如何期望它仍然存在于单个单词中。再想一想,修改 if 条件。

    【讨论】:

    • 如果我使用以下条件怎么办? if (evarValue.getLength()>0)
    • 它应该可以工作,如果您不需要任何其他值,并且您的键和值在同一行。
    【解决方案3】:

    你必须检查另外一个条件

    eValue.equals("")

    另外,您的 not 条件仅适用于 \t。您需要将所有条件放在一起(如果您的要求是用空格/制表符/空省略所有值)。

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

    【讨论】:

    • 那么您可能想要打印出 eValue 并且是那里的确切内容。在比较之前也尝试 trim() 值。
    • 打印输出?我们如何在 Map-Reduce 程序中做到这一点?
    • 您可以执行 system.out.println 并检查运行应用程序的容器中的日志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多