原始数据如下图:

程序:

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. 学习了解Shiro框架

    有关Shiro安全框架 实现权限的几种方式 1)通过表来实现 2)shiro框架 3)Spring Security框架 shiro有哪些主要功能 1.授权 访问控制的过程,即确定谁有权访问 2.身份 ...

  2. pytorch笔记

    Tensor slice Tensor的indices操作 以[2,3]矩阵为例,slice后可以得到任意shape的矩阵,并不是说一定会小于2行3列. import torch truths=tor ...

  3. vue系列---理解Vue中的computed,watch,methods的区别及源码实现(六)

    _ 阅读目录 一. 理解Vue中的computed用法 二:computed 和 methods的区别? 三:Vue中的watch的用法 四:computed的基本原理及源码实现 回到顶部 一. 理解 ...

  4. git jenkins 基本部署 gitlab私有仓库

    从代码私有性方面来看,公司不希望员工获取到全部的代码,这个时候 GitLab 无疑是最佳的选择.但对于开源项目而言,GitHub 依然是代码托管的首选平台. 1.安装gitlab[root@gitla ...

  5. SQL 方面基础操作,主要针对数据库方面的操作步骤

    SQL 结构化查询语言  适用于所有的SQL数据库 SQL  要求每条指令后末端 都要有分号(;),分号是标准方法,对服务器相同请求中执行一条以上的sql语句. 最终目的: 实现对数据库数据的  增 ...

  6. lamda和匿名内部类

    匿名内部类 匿名内部类在日常编程中还是经常会使用的.比如 ArrayList<String> list=new ArrayList<>(); list.add(new Stri ...

  7. Yii 数据库重连告别General error: 2006 MySQL server has gone away

    General error: 2006 MySQL server has gone away 错误原因 制造错误 解决办法 最新办法 错误原因 Mysql has gone away MySQL 服务 ...

  8. redis系列之------对象

    前言 Redis 并没有直接使用数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型的对象, 每种对象都 ...

  9. Python语法入门02

    引子 上一篇我们主要了解到了python这门编程语言,今天来说一下关于用户交互,数据类型和运算符方面的学习内容 用户交互 什么是用户交互? 用户交互就是人往计算机里输入数据(input),计算机输出结 ...

  10. 全方面讲解TensorFlow

    任何曾经试图在 Python 中只利用 NumPy 编写神经网络代码的人都知道那是多么麻烦.编写一个简单的一层前馈网络的代码尚且需要 40 多行代码,当增加层数时,编写代码将会更加困难,执行时间也会更 ...