Уменьшить карту текста в строку

Я пытаюсь разбить строку, используя mapreduce2 (yarn) в песочнице Hortonworks. Он выдает исключение ArrayOutOfBound Exception, если я пытаюсь получить доступ к val[1] , отлично работает, когда я не разбиваю входной файл.

Картограф:

public class MapperClass extends Mapper<Object, Text, Text, Text> {

    private Text airline_id;
    private Text name;
    private Text country;
    private Text value1;

    public void map(Object key, Text value, Context context)
            throws IOException, InterruptedException {

        String s = value.toString();
        if (s.length() > 1) {

            String val[] = s.split(",");
            context.write(new Text("blah"), new Text(val[1]));
        }


    }
}

Редуктор:

public class ReducerClass extends Reducer<Text, Text, Text, Text> {

private Text result = new Text();

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

    String airports = "";

    if (key.equals("India")) {
        for (Text val : values) {
            airports += "\t" + val.toString();
        }
        result.set(airports);
        context.write(key, result);
    }
}
}

Основной класс:

public class MainClass {

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

    Configuration conf = new Configuration();
    @SuppressWarnings("deprecation")
    Job job = new Job(conf, "Flights MR");

    job.setJarByClass(MainClass.class);
    job.setMapperClass(MapperClass.class);
    job.setReducerClass(ReducerClass.class);

    job.setNumReduceTasks(0);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);

    job.setInputFormatClass(KeyValueTextInputFormat.class);

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

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

}

}

Вы можете помочь?

Обновление:

Выяснил, что он не преобразует текст в строку.


person Sundari    schedule 03.02.2017    source источник
comment
Вам действительно нужно использовать mapreduce2? Есть более простые способы разделения строк. Например, метод split() из класса String или класса StringTokenizer.   -  person Rosário Pereira Fernandes    schedule 04.02.2017
comment
да. Я пробую это через уменьшение карты. @RosárioPereiraFernandes   -  person Sundari    schedule 04.02.2017


Ответы (1)


Если строка, которую вы разбиваете, не содержит запятой, результирующая String[] будет иметь длину 1 со всей строкой в ​​val[0].

В настоящее время вы следите за тем, чтобы строка не была пустой строкой.

if (s.length() > -1)

Но вы не проверяете, что разделение действительно приведет к массиву длины более 1, и предполагаете, что разделение было.

context.write(new Text("blah"), new Text(val[1]));

Если разделения не было, это вызовет ошибку выхода за границы. Возможным решением было бы убедиться, что строка содержит хотя бы 1 запятую, вместо проверки того, что это не пустая строка, например:

String s = value.toString();
if (s.indexOf(',') > -1) {

    String val[] = s.split(",");
    context.write(new Text("blah"), new Text(val[1]));
}
person Hangman4358    schedule 03.02.2017
comment
Он не преобразует текст в строку. Он печатает null в выходном файле. @Виселица4358 - person Sundari; 04.02.2017