рассчитать время входа для сотрудника в hadoop - PullRequest
0 голосов
/ 29 сентября 2018

Я пытался вычислить общее время входа в систему для сотрудников в моей программе уменьшения карты, используя Java.Мой редуктор не давал мне никакого вывода, поэтому я попытался вывести пары ключ-значение как есть.Я не могу организовать свой массив в редукторе на основе даты для расчета общего времени.Ваша помощь в этом очень важна.

Мой файл журнала содержит данные для входа сотрудников, как указано ниже.

101 IN 9:00
102 IN 9:15
103 IN 9:16
104 IN 9:25
103 OUT 10:00
105 IN 10:30
101 OUT 11:30
101 IN 11:45
102 OUT 12:30
101 OUT 13:00
105 OUT 13:05
104 OUT 14:30

Моя функция карты приведена ниже

public class login_map extends MapReduceBase implements Mapper<LongWritable,Text,Text,Text>{
public void map (LongWritable key,Text value,OutputCollector <Text,Text>output, Reporter reporter)throws IOException{
String line = value.toString();
String emp_id = line.substring(0, 3);
String punch = line.substring(4);
output.collect(new Text (emp_id), new Text(punch));
}
}

Соответствующий редуктор приведен ниже

public class login_reduce extends MapReduceBase implements Reducer<Text,Text,Text,Text>{ 
    public void reduce(Text key,Iterator <Text> values,OutputCollector <Text,Text>output,Reporter reporter)throws IOException{
        ArrayList<Date> a = new ArrayList<Date>();
        SimpleDateFormat punch = new SimpleDateFormat("HH:mm");
        while (values.hasNext()){
            String entry = values.next().toString();
                try{a.add(punch.parse(entry.substring(7)));}
            catch(java.text.ParseException e){
                e.printStackTrace();
            }
        }       //end of while
        Iterator itr = a.iterator();
        while (itr.hasNext()){
            output.collect(key, new Text(itr.next().toString()));
        }
}
}

Ожидаемый выход

101 3:45
102 3:15
103 0:44
104 4:55
105 2:35

Заранее спасибо.

...