将Epoch转换为日期和时间 - HADOOP

时间:2017-11-01 22:13:41

标签: java hadoop mapreduce

我想学习hadoop(mapreduce)。我有一个mapper方法,我使用Date类来解析; epoch_time;字段以毫秒为单位表示数据集。该数据集包括2015年5月25日至2015年8月10日之间的纪元。

我想将纪元转换为日期/时间,但只返回2015年6月5日至2015年6月15日期间的纪元日期/时间。

这是我迄今取得的成就。下面的代码产生以下内容:

输出:

2015年5月25日

2015年6月25日

期望的输出

05.06.2015 5 //此日期的单词出现次数

06.06.2015 53

07.06.2015 41

映射

   public class mapper extends Mapper<Object, Text, Text, IntWritable> { 
    private Text data = new Text();
     private IntWritable one = new IntWritable(1);
   String time;

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

String[] userinput = value.toString().split(";");
try{    


        LocalDateTime epoch = LocalDateTime.ofEpochSecond(Long.parseLong(userinput[0])/1000, 0, ZoneOffset.UTC);
        DateTimeFormatter f = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        time = epoch.format(f);




    data.set(time);
    context.write(data,one);
}
catch(Exception e){
    System.out.println("Error: " + e);
}

    }
}

Reducer

     public class reducer extends Reducer<Text, IntWritable, Text, IntWritable> {

private IntWritable one = new IntWritable();

public void reduce(Text key, Iterable<IntWritable> values, Context context)

    throws IOException, InterruptedException {

    int sum = 0;

    for (IntWritable value : values) {

        sum+=value.get();

    }

    one.set(sum);
    context.write(key, one);

}

}

1 个答案:

答案 0 :(得分:0)

所以你只关心这个括号数据...... 25.05.2015 [05.06.2015 ... 15.06.2015] 10.08.2015

如果这就是您所需要的,那就像if语句一样简单。

我对Java 8并不熟悉,但请查看Java: how do I check if a Date is within a certain range?

public class mapper extends Mapper<Object, Text, Text, IntWritable> { 
   private Text data = new Text();
   private static final IntWritable ONE = new IntWritable(1);
   private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy");
   String time;

   // Define the boundaries
   private LocalDateTime start = LocalDateTime.parse("2015.06.05", FMT);
   private LocalDateTime end = LocalDateTime.parse("2015.06.15", FMT);

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

       String[] userinput = value.toString().split(";");
       try {
           Long ms = Long.parseLong(userinput[0])/1000;    
           LocalDateTime inputEpoch = LocalDateTime.ofEpochSecond(ms, 0, ZoneOffset.UTC);

           // Filter your data
           if (inputEpoch.isAfter(start) && inputEpoch.isBefore(end)) {
               data.set(inputEpoch.format(FMT));
               context.write(data,ONE);
           }
       } catch (...) { }
   }
}