一个自动修正数据时间和补全缺失数据的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 ...
随机推荐
- 百万年薪python之路 -- 生成器
1.生成器 #本质就是迭代器 1.1 生成器的构建方式 在python中有三种方式来创建生成器: 1.通过生成器函数 2.通过生成器推导式 3.python内置函数或者模块提供 1.2 生 ...
- SpringBoot学习(二)探究Springboot启动机制
引言: SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起探究一下SpringBoot的启动原 ...
- Linux下zkui的安装
前提:部署好java环境 1.拉取安装包 git clone https://github.com/DeemOpen/zkui.git 2.进入zkui目录 cd zkui/ 3.使用mvn命令进行编 ...
- LeetCode 十月份题目汇总
开源地址:点击该链接 前言 十月份共有60道题目,全部属于 Easy 难度的,所以公众号中分享出来的并不多,只是挑了一些感觉还可以的才分享了出来,这60道题目我按照不同类别进行了分类整理,所有源码以及 ...
- 文件读取(filestream)
在stream中已经介绍过,文件读取应用filestream,其是以字节为单位读取文件的.在操作中,当应用filestream创建文件流,读取时应先定义一个字节数组,在转化成char类型,最后转化成s ...
- 这一次,终于系统的学习了 JVM 内存结构
最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...
- Python 加密 shellcode 免杀
Python 加密 shellcode 免杀 环境准备: Windows7 32 位系统: Shellcode 使用 kali linux Metasploit 生成 shellcode Wind ...
- 干货 Elasticsearch 知识点整理二
目录 root object mate-field 元数据字段 mapping-parameters 动态mapping(dynamic mapping) 核心的数据类型 精确匹配与全文检索 精确匹配 ...
- android 7.0 pm install 失败问题
这两天,把app内置成系统文件或者系统签名取得系统权限,发现使用pm install path在低版本上可行,在高版本就安装失败 抛出 NullPointException,查看了一下源码,发现对包名 ...
- vue2-preview引用时报错解决办法
1.报错信息 在完全按照官方文档安装引入vue2-preview时出现报错,报错信息如下: 从图中标记处可以知道出错是因为在\node_modules\_vue2-preview@1.0.2@vue2 ...