Я пытался вычислить общее время входа в систему для сотрудников в моей программе уменьшения карты, используя 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
Заранее спасибо.