2015-04-05 6 views
-2
import java.io.IOException; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reporter; 


public class ADDMapper extends MapReduceBase implements Mapper<LongWritable, 
           Text,Text,LongWritable> 
{ @Override 
public void map(LongWritable key, Text value,OutputCollector<Text, LongWritable> output, Reporter r)throws IOException 
    { 
    String s=value.toString(); 
     char[] words=s.toCharArray(); 
        int wno=0; 
        int ino=0; 
     for(int i=0;i<words.length;i++) 
      {  

      String temp=""; 
       for(int j=ino;j<words.length;j++) 
        {       

         if(words[j]!=' ') 
         { temp+=words[j]; 
         } 
         else 
         { 
          wno=j; 
         if(temp!="") 
         {  

          ino=ino + key; //////POINT OF ERROR 

     output.collect(new Text(temp),new LongWritable(ino)); 
         } 

        temp=""; 

         ino=wno+1; 
         break; 
         } 

        } 
     } 
} 

}Hadoop Map-Reduce картографа программирование

Я хочу, чтобы получить значение индекса каждой строки, отсортированные по строке.
Вышеприведенный код не дает значения индекса и не перетаскивает строки. let входной файл: привет как вы привет я прав. как ваша работа. привет, ты в порядке.

выход: утра 50 являются 7,33 привет 0,30,44 как 3,14 . .

+2

Не могли бы вы (а) правильно форматировать свой код и (б) НЕ ПРОСИТЕ ВОПРОСЫ В КАПС, пожалуйста? Кроме того, прочитайте [как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) для получения дополнительных советов. Ваш вопрос, как есть, получит мало ответов. –

ответ

1

Пожалуйста, используйте приведенный ниже код, он работает нормально и дает ожидаемый результат.

обеспечивают входной и выходной путь в качестве аргументов командной строки. (Арг [0], арг [1])

import java.io.IOException; 
import java.util.*; 
import java.util.Map.Entry; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapred.*; 


    public class IndexCount { 

     public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 
     public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 

      String str=value.toString(); 
      String[] tokens = str.split(" "); //split into words 
      //create hashmap for unique word 
      HashMap<String,Integer> uniqueString = new HashMap<String,Integer>(); 
      for(int i=0;i<tokens.length;i++){ 
       uniqueString.put(tokens[i],1); 
      }  
      //for sorting create TreeMap from above hash map 
      TreeMap<String, Integer> map = new TreeMap<String,Integer>(uniqueString); 
      for (Entry<String, Integer> entry : map.entrySet()) { 
       int index=0; 
      //find the index of the word 
       index = str.indexOf((String)entry.getKey()); 
       while (index >= 0) { 
         output.collect(new Text((String)entry.getKey()),new IntWritable(index)); 
         index = str.indexOf((String)entry.getKey(), index + 1); 
       } 
      } 
     } 
    } 
     public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { 
     public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 

      while (values.hasNext()) { 
       output.collect(key, new IntWritable(values.next().get())); 
      } 

     } 
    } 
     public static void main(String[] args) throws Exception { 
     JobConf conf = new JobConf(WordCount.class); 
     conf.setJobName("indexfinder"); 

     conf.setOutputKeyClass(Text.class); 
     conf.setOutputValueClass(IntWritable.class); 
     conf.setMapperClass(Map.class); 
     conf.setCombinerClass(Reduce.class); 
     conf.setReducerClass(Reduce.class);  
     conf.setInputFormat(TextInputFormat.class); 
     conf.setOutputFormat(TextOutputFormat.class); 

     FileInputFormat.setInputPaths(conf, new Path(args[0])); 
     FileOutputFormat.setOutputPath(conf, new Path(args[1])); 

     JobClient.runJob(conf); 
     } 
    } 
+0

он гарри Гупта это Гупта гарри привет Гарри, как ты. привет Гупта, как вы хорошо выглядеть Гупта, как если есть разрыв строки затем код начинается с «0», но значение индекса не должно повторяться с 0 (ноль) снова ... он должен принимать следующее значение индекса в непрерывной форме ... этот код дает для hi 0, его 0, это 0, hi 0, равно 2, равно 1, равно 4, равно 5 , но каждая строка должна начинаться с ее pr значащее значение индекса символа плюс текущий индекс символа. –

+0

Привет, Пожалуйста, примите небольшой пример. И напишите его ожидаемый результат. поэтому я могу легко понять. Возьмите два или три строки. –

+0

Входной файл «::: hi how are you.hi Как ваша работа ............ предположим, что это двухстрочный текстовый файл. Таким образом, вывод для этого файла должен быть :::: 7, hi 0, hi 15, как 3, how18, ... каждая строка должна начинаться со своего значения «ключ» плюс «индекс». (Следующая строка не должна начинаться с индекса «0», она должна продолжить индексирование Первая строка. Вторая строка должна продолжаться с индексом 15 –

1

Hi Shivendra Я написал приведенную ниже схему отображения, которая поможет вам найти индекс каждой строки с отсортированным выводом. Результат этого кода сортируется Строка со своим индексом, тогда вы можете запустить редуктор на этом выходе.

String str=value.toString(); 
String[] tokens = str.split(" "); //split into words 
//create hashmap for unique word 
Map<String,Integer> uniqueString = new HashMap<String,Integer>(); 
for(int i=0;i<tokens.length;i++){ 
    uniqueString.put(tokens[i],1); 
}  
//for sorting create TreeMap from above hash map 
Map<String,Integer> map = new TreeMap<String,Integer>(uniqueString); 
for (Map.Entry entry : map.entrySet()) { 
    int index=0; 
//find the index of the word 
    index = str.indexOf((String)entry.getKey()); 
    while (index >= 0) { 
      output.collect(new Text((String)entry.getKey()),new LongWritable(index)); 
      index = str.indexOf((String)entry.getKey(), index + 1); 
    } 
} 

выход этой логики: утра: 20, являются: 7, являются: 50, привет: 0, привет: 15, привет: 47, , как: 3, , как: 30, я: 1, я: 16, я: 18, я: 24, я: 34, я: 48, это: 34, job.:42, ok.:58, right.:23, вы: 11, вы: 37, вы: 54, Ваш: 37

Возможно, вам это поможет.

+0

На самом деле я новичок в карте редуктора, поэтому я немного затрудняюсь с тем, чтобы писать код сокращения и запускать их ... –

+0

положить выше код в mapper, и вам просто нужно создать пустой редуктор. Нет никакого кода в редукторе. вы получите ожидаемый результат. желаю вам всего наилучшего –

+0

Привет, Chandu, это помогает мне до некоторой степени, но я новичок в программировании с уменьшением числа карт и затрудняюсь при реализации этого фрагмента кода в своем полном коде и получении некоторой ошибки. Не могли бы вы сообщить мне, какие файлы требуются библиотеки/заголовочный файл или любой .dll, который мне нужно импортировать или писать в коде картографа. Я запускаю этот код без редуктора. –

1

Пожалуйста, запустите приведенный ниже код, его поддавки ожидаемый результат.

import java.io.IOException; 
    import java.util.*; 
    import java.util.Map.Entry; 

    import org.apache.hadoop.fs.Path; 
    import org.apache.hadoop.conf.*; 
    import org.apache.hadoop.io.*; 
    import org.apache.hadoop.mapreduce.*; 
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; 

    public class Index { 

     public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { 


     public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
      String str=value.toString(); 
       String[] tokens = str.split(" "); //split into words 
       //create hashmap for unique word 
       HashMap<String,Integer> uniqueString = new HashMap<String,Integer>(); 
       for(int i=0;i<tokens.length;i++){ 
        uniqueString.put(tokens[i],1); 
       }  
       //for sorting create TreeMap from above hash map 
       TreeMap<String, Integer> map = new TreeMap<String,Integer>(uniqueString); 
       Configuration conf=context.getConfiguration(); 
       int strIndex = 0; 
       for (Entry<String, Integer> entry : map.entrySet()) { 
        //int index=0; 
        strIndex=conf.getInt("index", 0); 
       //find the index of the word 
        int index = str.indexOf((String)entry.getKey()); 
        while (index >= 0) { 
          index+=strIndex; 
          context.write(new Text((String)entry.getKey()),new IntWritable(index)); 
          index = str.indexOf((String)entry.getKey(), index + 1); 
        } 
       } 
       conf.setInt("index", strIndex+str.length()); 
      } 
     } 

    public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { 

    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
     throws IOException, InterruptedException { 

     for (IntWritable val : values) { 
      context.write(key, new IntWritable(val.get())); 
     } 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 

     conf.setInt("index", 0); 
     Job job = new Job(conf, "index"); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 

    job.setMapperClass(Map.class); 
    job.setReducerClass(Reduce.class); 

    job.setInputFormatClass(TextInputFormat.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 

    FileInputFormat.addInputPath(job, new Path("input")); 
    FileOutputFormat.setOutputPath(job, new Path("output")); 

    job.waitForCompletion(true); 
    } 

} 
+0

в программировании с уменьшением карты. Можем ли мы написать некоторый определенный пользователем класс? .... если мы хотим использовать структуру данных списка ссылок .. можем ли мы это сделать? –

+0

да , мы можем это сделать, и, пожалуйста, назначьте мой ответ в качестве правильного ответа.Это поможет мне хорошо профилировать мой профиль. –

+0

, пожалуйста, напишите любой пример структуры данных .. где мы создали пользовательскую функцию и классы –