2016-12-02 1 views
0

Je suis donc en train d'apprendre Hadoop et d'essayer le didacticiel WordCount.java qui fonctionne correctement. Je n'ai aucun problème avec ça. Mon seul problème est que lorsque j'obtiens mes résultats dans le fichier de sortie, je veux ajouter moi-même dans Strings. Alors disons que j'ai un autre fichier que j'ai lu, je veux qu'il soit lisible, par exemple.Formatage et lisibilité de la sortie dans Hadoop

========= Output 1 ========= 
// Results here 
============================ 

========= Output 2 ========= 
// 2nd Results here 
============================ 

Plutôt que

// Results here 
// More results 

Je veux essentiellement juste pour être en mesure d'envoyer une sortie une fois le fichier de sortie. Quel est le meilleur endroit/moyen de le faire? Je suppose que ce serait dans le principal mais je ne suis pas sûr. Est-ce que hadoop a été conçu (utilisé?) Pour cela ou devrais-je utiliser une sorte de script bash pour travailler à rendre le fichier de sortie joli?

code

ci-dessous,

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

import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.conf.*; 
import org.apache.hadoop.io.*; 
import org.apache.hadoop.mapred.*; 
import org.apache.hadoop.util.*; 

public class WordCount { 

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 
    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { 
    String line = value.toString(); 
    StringTokenizer tokenizer = new StringTokenizer(line); 
    while (tokenizer.hasMoreTokens()) { 
     word.set(tokenizer.nextToken()); 
     output.collect(word, one); 
    } 
    } 
} 

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 { 
    int sum = 0; 
    while (values.hasNext()) { 
     sum += values.next().get(); 
    } 
    output.collect(key, new IntWritable(sum)); 
    } 
} 

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

    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); 
} 
} 

Répondre

0

Je crois que je peux utiliser NullWritable pour cela. S'il y a un meilleur moyen, veuillez poster une réponse.