Перевод SQL в MapReduce java.lang.NoSuchMethodException при попытке запустить основной класс - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть 2 базы данных в текстовых файлах: ПОЛЬЗОВАТЕЛИ (имя, фамилия, тел, zipCode, город) ЗВОНКИ (от номера, до номера, продолжительность) я хотел бы перевести этот запрос SQL в MapReduce, используя Java

SELECT firstName, lastName
FROM users U, calls C
WHERE U.tel=C.toNumber AND U.City='Le Mans';

когда я пытаюсь запустить свою программу в кластере Hadoop, я получаю java.lang.NoSuchMethodException, помогите мне, пожалуйста, вот мой полный код:

class UsersCallsJoin - имя программы UsrTokenizerMapper - файл Mapper of USERS CallsTokenizerMapper - это файл Mapper of CALLS UsersCallsReducer - это редуктор

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class UsersCallsJoin {
    public static class UsrTokenizerMapper extends Mapper <Object, Text, Text, Text> {
        public void map (Object key, Text value, Context context) throws IOException, InterruptedException {
            String record = value.toString();
            String[] parts = record.split(",");
            if (parts[4] == "LE MANS")
            context.write(new Text(parts[2]),new Text("usr\t" + parts[0]+":"+parts[1]));
        }

    }
    public static class CallsTokenizerMapper extends Mapper <Object, Text, Text, Text> {
        public void map (Object key, Text value, Context context) throws IOException, InterruptedException {
            String record = value.toString();
            String[] parts = record.split(",");
            context.write(new Text(parts[1]), new Text("calls"));
        }
    }

        public static class UsersCallsReducer extends Reducer <Text, Text, Text, Text> {
        public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        String name = "";
        boolean callOK = false;
        boolean UsrOK = false;

        for (Text t : values) { 

        //String parts[] = t.toString().split("\t");
        if (t.toString().startsWith("usr")){
          UsrOK = true;
         parts = t.toString().split("\t");
         name = parts[1];
        }
        else if (t.toString().startsWith("calls")) 
        callOK = true;
        }

        if (UsrOK && callOK) {
            context.write(new Text(name), new Text(""));
        }

        }

        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            Job job = new Job(conf, "user call");
            job.setJarByClass(UsersCallsJoin.class);
            job.setReducerClass(UsersCallsReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(Text.class);
            MultipleInputs.addInputPath(job, new Path(args[0]),TextInputFormat.class, UsrTokenizerMapper.class);
            MultipleInputs.addInputPath(job, new Path(args[1]),TextInputFormat.class, CallsTokenizerMapper.class);
            Path outputPath = new Path(args[2]);
            FileOutputFormat.setOutputPath(job, outputPath);
            outputPath.getFileSystem(conf).delete(outputPath);
            System.exit(job.waitForCompletion(true) ? 0 : 1);
            }
        } 

когда я пытаюсь это вычеркнуть / home / hadoop / hadoop / bin / hadoop jar usercalljoin.jar UsersCallsJoin /path/to/users2.txt /path/to/calls2.txt вывод

Это ошибка, которую я получаю

Exception in thread "main" java.lang.NoSuchMethodException: UsersCallsJoin.main([Ljava.lang.String;)
at java.lang.Class.getMethod(Class.java:1786)
at org.apache.hadoop.util.RunJar.run(RunJar.java:228)
at org.apache.hadoop.util.RunJar.main(RunJar.java:148)
...