【问题标题】:Hadoop mapReduce How to store only values in HDFSHadoop mapReduce 如何在 HDFS 中仅存储值
【发布时间】:2014-05-13 21:17:20
【问题描述】:

我正在使用它来删除重复的行

public class DLines
 {
   public static class TokenCounterMapper extends Mapper<Object, Text, Text, IntWritable>
    {
    private final static IntWritable one = new IntWritable(1);
      private Text word = new Text();
      @Override
      public void map(Object key, Text value, Context context) throws IOException, InterruptedException
       {
           String line=value.toString();
           //int hash_code=line.hashCode();
           context.write(value, one);
       }
   }

public static class TokenCounterReducer extends Reducer<Text, IntWritable, Text, IntWritable> 
 {
        @Override
    public void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException 
     {
 public void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException 
     {
       int sum = 0;
       for (IntWritable value : values) 
       {   
           sum += value.get();        
       }
       if (sum<2)
           {
             context.write(key,new IntWritable(sum));
           }
      }
      }

我只需要在 hdfs 中存储密钥。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    如果您不需要减速器的值,只需使用NullWritable

    你可以简单地说context.write(key,NullWritable.get());

    在你的驱动中,你也可以设置

     job.setMapOutputKeyClass(Text.class);
     job.setMapOutputValueClass(IntWritable.class);
    

    &

     job.setOutputKeyClass(Text.class);
     job.setOutputValueClass(NullWritable.class);
    

    【讨论】:

    • 任何代码更改,当组合器与上述代码一起使用时。对我来说出错了。
    【解决方案2】:

    您可以使用NullWritable 类来做到这一点。

    public class DLines
     {
       public static class TokenCounterMapper extends Mapper<Object, Text, Text, IntWritable>
        {
        private final static IntWritable one = new IntWritable(1);
          private Text word = new Text();
          @Override
          public void map(Object key, Text value, Context context) throws IOException, InterruptedException
           {
               String line=value.toString();
               context.write(value, one);
           }
       }
    
    public static class TokenCounterReducer extends Reducer<Text, IntWritable, Text, NullWritable> 
     {
       NullWritable out = NullWritable.get();
            @Override
        public void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException 
           {
           int sum = 0;
           for (IntWritable value : values) 
           {   
               sum += value.get();        
           }
           if (sum<2)
               {
                 context.write(key,out);
               }
          }
          }
    

    驱动程序代码

    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IntWritable.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(NullWritable.class);
    

    希望这能回答你的问题。

    【讨论】:

    • 我尝试了同样的方法,它工作正常。但是当我使用组合器时,我收到错误,因为 java.io.IOException: wrong value class: class org.apache.hadoop.io.NullWritable 是不是类 org.apache.hadoop.io.IntWritable
    • @Abhinay:在这种情况下,您不能使用组合器。组合器是小型化简器,其操作是可交换和关联的,组合器的签名应该与还原器匹配。如果组合器签名是“",reducer输入key和value分别是--Text和IntWritable会报错,但是combiners的输出key和value类是Text,NullWritable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2017-11-26
    相关资源
    最近更新 更多