Как напечатать некоторые из токенов в строке в формате MapReduce? - PullRequest
0 голосов
/ 10 октября 2018

Я пишу функцию карты.У меня есть текстовый файл как:

364.2   366.6   365.2   0   0   1   10421
364.2   366.6   365.2   0   0   1   10422

Я хочу показать столбец 1,3.Это мой код, но он показывает все строки.

public static class SumMap extends Mapper<Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text str = new Text();

    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer lineIter = new StringTokenizer(value.toString(), "\\r?\\n");
        while (lineIter.hasMoreTokens()) {
            StringTokenizer tokenIter = new StringTokenizer(lineIter.nextToken(), "\\s+");
            while (tokenIter.hasMoreTokens()) {
                String v1 = tokenIter.nextToken();
                String v2 = tokenIter.nextToken();
                String c1 = tokenIter.nextToken();
                String c2 = tokenIter.nextToken();
                str.set(v1+c1);
                context.write(str, one);
            }

        }
    }
}

В этом коде первый должен быть разделен на строку ("\\r?\\n"), а затем для каждой строки разделен на число или строку или токен на ("\\s+").Наконец, напечатайте v1+c1.Как я могу изменить свой код?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Если вы используете TextInputFormat, ключ карты - это номер строки, а значение - ее содержимое.Вам не нужны разделенные линии.просто разбить каждую строку:

@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
    String[] vals = value.toString().split("\\s+");
    if (vals.length == 7) {
        context.write(new Text(vals[0] + vals[2]), one);
    }

}
0 голосов
/ 10 октября 2018

Проблема заключается в количестве генерируемых токенов и количестве токенов, к которым вы обращаетесь.Во внутреннем цикле while количество сгенерированных токенов будет равно 7. Но вы получаете доступ только к 4 из них одновременно.Что вам нужно сделать, это получить доступ ко всем токенам одновременно.Поскольку вам нужны только столбцы 1 и 3, получите их и сохраните отдельно.

public static class SumMap extends Mapper<Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text str = new Text();

    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer tokenIter = new StringTokenizer(lineIter.nextToken(), "\\s+");
        while (tokenIter.hasMoreTokens()) {
            String c1 = tokenIter.nextToken();
            String c2 = tokenIter.nextToken();
            String c3 = tokenIter.nextToken();
            String c4 = tokenIter.nextToken();
            String c5 = tokenIter.nextToken();
            String c6 = tokenIter.nextToken();
            String c7 = tokenIter.nextToken();
            str.set(c1+c3);
            context.write(str, one);
        }
    }
}

main:

    public static void main(String[] args) throws FileNotFoundException, IOException, InterruptedException, ClassNotFoundException {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "sum");
        job.setJarByClass(SumMR.class);
        job.setMapperClass(SumMap.class);
//        job.setCombinerClass(IntSumReducer.class);
//        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        TextInputFormat.addInputPath(job, new Path(args[1]));
        FileOutputFormat.setOutputPath(job, new Path(args[2]));

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

Это модифицированный код.Если есть проблема, дайте мне знать!

...