原始数据如下图:

程序:

Mapper类:

 public class DemoMapper extends Mapper<LongWritable,Text,IntWritable,Text>{
IntWritable k = new IntWritable();
Text v = new Text(); @Override
protected void map(LongWritable key,Text value,Mapper<LongWritable,Text,IntWritable,Text>.Context context)
throws IOException,InterruptedException{
String[] data = value.toString().split(",");
k.set(Integer.parseInt(data[0]));
try{
v.set(Utils.getFixTime(data[1]));
context.write(k,v);
}catch(ParseException e){
e.printStackTrace();
}
}
}

Reducer类:

 public class DemoReducer extends Reducer<IntWritable,Text,NullWritable,Text>{
Text v = new Text(); @Override
protected void reduce(IntWritable key,Iterable<Text> values,Reducer<IntWritable,Text,NullWritable,Text>.Context context)
throws IOException,InterruptedException{
TreeSet<Long> timeSet = new TreeSet<>();
for(Text value : values){
try{
timeSet.add(getTime(value.toString()));
}catch{
e.printStackTrace();
}
}
long tmp = -1;
for(long time :timeSet){
if(tmp == -1){
v.set(key.toString()+","+getDate(time));
context.write(NullWritable.get(),v);
}else{
if(time - tmp > 900000){
for(int i=0;i<= (time - tmp)/900000;i++){
v.set(key.toString()+","+getDate(tmp+900000*i));
}
}else{
v.set(key.toString()+","+getDate(time));
context.write(NullWritable.get(),v);
}
}
tmp =time;
}
}
public static long getTime(String str)throws ParseException{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
return simpleDateFormat.parse(str).getTime();
} public static String getDate(long timetmp){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
return simpleDateFormat.format(timeStamp);
}
}

Driver类:

 public class DemoDriver{
public static void main(String[] args)throws IllegalArgumentException,IOException,ClassNotFoundException,InterruptedException{
if(args.length <2){
System.err.println("you must input two argument!");
System.exit(-1);
}
Configuration conf = Utils.getConf();
Job job =Job.getInstance(conf, "fix time");
job.setJarByClass(DemoDriver.class);
job.setMapperClass(DemoMapper.class);
job.setReducerClass(DemoReducer.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
job.setNumReduceTask(1);
for(int i =0;i <args.length-1;i++){
FileInputFormat.addInputPath(job,new Path(args[i]));
}
FileSystem.get(conf).delete(new Path(args[args.length-1]),true);
FileOutputFormat.setOutputPath(job,new Path(args[args.length-1]));
System.exit(job.waitForCompletion(true)?0:1);
}
}

一个自动修正数据时间和补全缺失数据的MapReduce程序的更多相关文章

  1. MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844

    查看分区数据量,查看全库数据量 USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PAR ...

  2. Mac或者linux系统自动加载python tab补全功能

    因为mac OS属于类unix系统,所以基本和linux系统使用相差不大,只是用户登陆时自动执行环境变量文件的区别 mac系统: ShanedeMBP:login_api shane$ vi ~/.b ...

  3. React 创建一个自动跟新时间的组件

    componentDidMount声明周期函数 表示组件渲染完成后 componentWillUnmount声明周期函数 组件将要卸载 通常用于(为了防止内存泄漏 清除定时器) 11==>创建组 ...

  4. oracle新增ID主键列,如何补全旧数据的ID值

    1.创建SEQUENCE CREATE SEQUENCE MONKEY.TEST_ADD_IDCOL_ID CACHE 100; 2.新增表栏位 ALTER TABLE MONKEY.TEST_ADD ...

  5. 【AJAX】AJAX实现搜索信息自己主动推荐并补全

    好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完.我们在搜索引擎中输入文字时文本框下会提示对应的信息,这个案例就是实现这样的基本功能,代码比較粗糙还须要进一步完好,当中有些地方也须要向 ...

  6. notepad++代码自动补全功能

    可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了

  7. 基于linux vim环境python代码自动补全

    (一)简述 在使用vim编写python文件的过程中,默认的vim不会实现代码补全功能,在写程序或者是改程序的时候不是很方面,很容易出错,但是vim提供了各种插件,其中包括这个python文件的自动补 ...

  8. 基于python机器学习人脸自动补全

    import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression ...

  9. 深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全

    深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全 原文地址:Image Completion with Deep Learning in TensorFlow by Bra ...

随机推荐

  1. 现在Java 桌面应用程序能做到什么程度(Spring Boot+JavaFX2开发)

    Spring Boot - JavaFX 2.0应用 很多人对Java开发native程序第一反应还停留在暗灰色单一风格的Java GUI界面,开发方式还停留在AWT或者Swing.本文主要基于Spr ...

  2. GStreamer基础教程11 - 与QT集成

    摘要 通常我们的播放引擎需要和GUI进行集成,在使用GStreamer时,GStreamre会负责媒体的播放及控制,GUI会负责处理用户的交互操作以及创建显示的窗口.本例中我们将结合QT介绍如何指定G ...

  3. 分享一次大厂的技术面试通过,却因学历被拒发 offer 的悲惨经历

    概述 今天心情很down,快周末了,说点不开心的事情给大家开心一下,上周面试心仪已久的大厂,技术面很顺利的通过一面/二面/三面,最后到HR面也很顺利,然后被问到学历(自考本科)后,HR 语气发生一些转 ...

  4. Redis(三)Redis附加功能

    一.慢查询分析 许多存储系统(例如MySql)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作. 所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息 ...

  5. 获取用户地理位置.html

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. SpringBoot 逻辑异常统一处理

    构建项目 我们将逻辑异常核心处理部分提取出来作为单独的jar供其他模块引用,创建项目在parent项目pom.xml添加公共使用的依赖,配置内容如下所示: <dependencies> & ...

  7. DRF之认证组件、权限组件、频率组件使用方法总结

    认证组件格式: from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...

  8. 你不知道的Canvas(二)

    你不知道的Canvas(二) 一.色彩Colors 到目前为止,我们只看到过绘制内容的方法.如果我们想要给图形上色,有两个重要的属性可以做到:fillStyle 和 strokeStyle. fill ...

  9. Hibernate 查询方式、JPA查询方式

    hibernate 查询方式: OID 查询 对象导航查询 HQL 方式查询 QBC方式查询 原生SQL方式查询 JPA 查询方式: OID 查询 对象导航查询 JPQL 方式查询 CriteriaB ...

  10. 百度NLP预训练模型ERNIE2.0最强实操课程来袭!【附教程】

    2019年3月,百度正式发布NLP模型ERNIE,其在中文任务中全面超越BERT一度引发业界广泛关注和探讨.经过短短几个月时间,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基 ...