2015-12-16 3 views
-1

У меня есть следующий алгоритм сортировки данных с помощью алфавитного порядкаСортировка данных Hadoop MapReduce

public void setup(Context context) throws IOException, 
     InterruptedException { 
     conf = context.getConfiguration(); 
     caseSensitive = conf.getBoolean("amasort.case.sensitive", true); 

    } 

    @Override 
    public void map(Object key, Text value, Context context 
        ) throws IOException, InterruptedException { 
     String line = (caseSensitive) ? value.toString() : value.toString().toLowerCase(); 
     word.set(line+"_"+key.toString()); 
     context.write(word, one); 
     System.out.println("key:"+key.toString()+";value:"+value.toString()); 
     } 
    } 

    public static class ForwardReducer 
     extends Reducer<Text,NullWritable,Text,NullWritable> { 
    private NullWritable result = NullWritable.get(); 

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

     String originalWord = key.toString(); 
     originalWord = originalWord.substring(0, originalWord.lastIndexOf("_")); 
     key.set(originalWord); 
     context.write(key, result); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    GenericOptionsParser optionParser = new GenericOptionsParser(conf, args); 
    String[] remainingArgs = optionParser.getRemainingArgs(); 
    Job job = Job.getInstance(conf, "word sort"); 
    job.setJarByClass(AmaSort.class); 
    job.setMapperClass(LineMapper.class); 
// job.setCombinerClass(ForwardReducer.class); 
    job.setReducerClass(ForwardReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(NullWritable.class); 

    FileInputFormat.addInputPath(job, new Path(remainingArgs[0])); 
    FileOutputFormat.setOutputPath(job, new Path(remainingArgs[1])); 

    System.exit(job.waitForCompletion(true) ? 0 : 1); 

я попробовал этот алгоритм сортировки MyData набор, который содержит (@xxxxxxx, 0, ТСР, хх, 1,1,1 , 2,4,5, ....), но вывод всех строк начинается с @, и структура строки данных 0, tcp, x1x1,1,114, .... изменены, я просто хочу сортировать свой набор данных с этим специфический символ (@). Все линии начинаются с @ в первом файле, а остальные остаются той же структурой. Кто-нибудь может мне помочь, чтобы изменить этот алгоритм?

ответ

0

Вы можете использовать ниже модифицированный код для выполнения сортировки,

import java.io.IOException; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.util.GenericOptionsParser; 

public class AmaSort 
{ 
    static Configuration conf = null; 
    private static boolean caseSensitive; 
    private static Text word = new Text(); 

    public static class LineMapper extends Mapper<Object, Text, Text, NullWritable>{ 

     public void setup(Context context) throws IOException, InterruptedException 
     { 
      conf = context.getConfiguration(); 
      caseSensitive = conf.getBoolean("amasort.case.sensitive", true); 

     } 

     @Override 
     public void map(Object key, Text value, Context context) throws IOException, InterruptedException 
     { 
      String line = (caseSensitive) ? value.toString() : value.toString().toLowerCase(); 
      word.set(line); 
      context.write(word, NullWritable.get()); 

     } 
    } 

    public static class ForwardReducer extends Reducer<Text, NullWritable, Text, NullWritable> 
    { 
     private NullWritable result = NullWritable.get(); 

     public void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException 
     { 
      context.write(key, result); 
     } 
    } 

    public static void main(String[] args) throws Exception 
    { 
    Configuration conf = new Configuration(); 
    GenericOptionsParser optionParser = new GenericOptionsParser(conf, args); 
    String[] remainingArgs = optionParser.getRemainingArgs(); 
// Job job = Job.getInstance(conf, "word sort"); 
    Job job = new Job(conf, "word sort"); 
    job.setJarByClass(AmaSort.class); 
    job.setMapperClass(LineMapper.class); 
    // job.setCombinerClass(ForwardReducer.class); 
    job.setReducerClass(ForwardReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(NullWritable.class); 

    FileInputFormat.addInputPath(job, new Path(remainingArgs[0])); 
    FileOutputFormat.setOutputPath(job, new Path(remainingArgs[1])); 

    System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 

} 
+0

Спасибо @prashant он работал, но есть много данных delted (мой оригинальный размер набора данных 36MB упорядоченные данные только 3.6MB) и я получил данные в 1-м файле 0, tcp, xxxxx.0,1,111, затем атрибут «At» .... и последние данные «At» Я хочу в этом порядке «At'attribute», затем одна строка «At» date, наконец, остальная данных Не могли бы вы помочь мне, пожалуйста, решить это? или если вы хотите отправить мне свой адрес электронной почты, чтобы связаться друг с другом – BigBosss

+0

Поскольку мы выполняем сортировку с использованием ключей, по умолчанию он будет сортировать ключ с помощью 'RowComparator', но если вы хотите отсортировать их с помощью своего пользовательского сортировки, вы можете реализовать свои собственные 'SortComparator', пожалуйста, посмотрите ссылку http://stackoverflow.com/questions/16184745/what-is-difference-between-sort-comparator-and-group-comparator-in-hadoop, кстати, вы можете связаться со мной на [email protected] –

+0

Можете ли вы также привести пример строк, которые удалены из исходных данных? и размер может быть уменьшен, поскольку дубликаты удаляются из данных. –