一个自动修正数据时间和补全缺失数据的MapReduce程序
原始数据如下图:

程序:
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程序的更多相关文章
- MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844
查看分区数据量,查看全库数据量 USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PAR ...
- Mac或者linux系统自动加载python tab补全功能
因为mac OS属于类unix系统,所以基本和linux系统使用相差不大,只是用户登陆时自动执行环境变量文件的区别 mac系统: ShanedeMBP:login_api shane$ vi ~/.b ...
- React 创建一个自动跟新时间的组件
componentDidMount声明周期函数 表示组件渲染完成后 componentWillUnmount声明周期函数 组件将要卸载 通常用于(为了防止内存泄漏 清除定时器) 11==>创建组 ...
- oracle新增ID主键列,如何补全旧数据的ID值
1.创建SEQUENCE CREATE SEQUENCE MONKEY.TEST_ADD_IDCOL_ID CACHE 100; 2.新增表栏位 ALTER TABLE MONKEY.TEST_ADD ...
- 【AJAX】AJAX实现搜索信息自己主动推荐并补全
好久没有继续看AJAX的视频教程了,今天就将最后一个教程案例做完.我们在搜索引擎中输入文字时文本框下会提示对应的信息,这个案例就是实现这样的基本功能,代码比較粗糙还须要进一步完好,当中有些地方也须要向 ...
- notepad++代码自动补全功能
可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了
- 基于linux vim环境python代码自动补全
(一)简述 在使用vim编写python文件的过程中,默认的vim不会实现代码补全功能,在写程序或者是改程序的时候不是很方面,很容易出错,但是vim提供了各种插件,其中包括这个python文件的自动补 ...
- 基于python机器学习人脸自动补全
import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression ...
- 深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全
深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全 原文地址:Image Completion with Deep Learning in TensorFlow by Bra ...
随机推荐
- js转换页面为图片并下载
<div style="background:red;width: 600px;height: 600px;" class="test"> < ...
- Logstash 入门
一.简介 Logstash 是开源的服务器端数据处理管道,支持从不同来源采集数据,装换数据,并将数据发送到不同的存储库中. Logstash 项目诞生于 2009 年 8 月 2 日.其作者是世界著名 ...
- docker-compose 的使用
1.安装docker-compose,参考官方教程:https://docs.docker.com/compose/install/ [chenjl@ipha-dev71- ~]$ sudo curl ...
- 推荐几个IT交流社区
博客园,csdn,掘金,StackOverflow(境外),v2ex,开源中国,简书,头条
- spark版本定制课程-第1课
spark版本定制课程-第1课 1.学习本课程可以自己动手改进spark,或者给spark增加功能.增加某些官方没有提供的功能,通过本课程希望早就一些顶级spark专家,根据整个社会的需要对spark ...
- ESP8266开发之旅 网络篇⑭ web配网
1. 前言 目前,市面上流行多种配网方式: WIFI模块的智能配网(SmartConfig以及微信AirKiss配网) SmartConfig 配网方式 请参考博主之前的博文 ESP8266开 ...
- Vue系列---理解Vue.nextTick使用及源码分析(五)
_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...
- solr学习篇(二) solr 分词器篇
关于solr7.4搭建与配置可以参考 solr7.4 安装配置篇 在这里我们探讨一下分词的配置 目录 关于分词 配置分词 验证成功 1.关于分词 1.分词是指将一个中文词语拆成若干个词,提供搜索引擎 ...
- 函数基础(三) 装饰器\闭包 day 12
目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...
- CPU爆满后的无助感
告警 晚七点刚好上地铁,握在手里的手机震动了好几下,根据震动这几下的手感已经判断出这是钉钉在告警了,十有八九就是线上的问题,通过Zabbix监控的一台线上服务器已经五分钟不可达,这应该不会是网络网络问 ...