mapreduce数据清理java_MapReduce实验-数据清洗-阶段⼀Result⽂件数据说明:
Ip:106.39.41.166,(城市)
Date:10/Nov/2016:00:01:02 +0800,(⽇期)
Day:10,(天数)
Traffic: 54 ,(流量)
Type: video,(类型:视频video或⽂章article)
Id: 8701(视频或者⽂章的id)
测试要求:
1、 数据清洗:按照进⾏数据清洗,并将清洗后的数据导⼊hive数据库中。
两阶段数据清洗:
(1)第⼀阶段:把需要的信息从原始⽇志中提取出来
ip: 199.30.25.88
time: 10/Nov/2016:00:01:03 +0800
traffic: 62
⽂章: article/11325
视频: video/3235
(2)第⼆阶段:根据提取出来的信息做精细化操作
ip--->城市city(IP)
date--> time:2016-11-10 00:01:03
day: 10
traffic:62
type:article/video
id:11325
(3)hive数据库表结构:
create table data( ip string, time string , day string, traffic bigint,
type string, id string )
2、数据处理:
·统计最受欢迎的视频/⽂章的Top10访问次数 (video/article)
·按照地市统计最受欢迎的Top10课程 (ip)
·按照流量统计最受欢迎的Top10课程 (traffic)
3、数据可视化:将统计结果倒⼊MySql数据库中,通过图形化展⽰的⽅式展现出来。
阶段⼀:
/*** MapReduce实验-数据清洗-阶段⼀
* ⾼泽伟19.11.20
**/
packageclasstest3;importjava.io.SimpleDateFormat;importjava.util.Date;importjava.util.Iterator;impor classDataClean {static String INPUT_PATH="hdfs://192.168.57.128:9000/testhdfs1026/run/";static String OUTPUT_PATH="hdfs://192.168.57.128:9000/testhdfs1026/run/output/DataClean";/** 数据格式:
* Ip Date Day|Traffic|Type|Id
* 106.39.41.166,10/Nov/2016:00:01:02 +0800,10,54,video,8701*/
public static final SimpleDateFormat FORMAT = new SimpleDateFormat("d/MMM/yyyy:HH:mm:ss", Locale.ENGLISH); //原时
间格式
public static final SimpleDateFormat dateformat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//现时间格式//提取数
据的函数
>>>>>>>>>>>>>>>>>####//将⼀⾏数据清洗整合到⼀个字符串数组⾥ parse:解析//String line --> String[]
public staticString[] parse(String line){
String ip=parseIP(line);
String date=parseTime(line);
String day=parseDay(line);
String traffic=parseTraffic(line);
String type=parseType(line);
String id=parseId(line);return newString[]{ip,date,day,traffic,type,id};
}//Ip
private staticString parseIP(String line) {
String ip=line.split(",")[0].trim();returnip;
}//Date
private staticString parseTime(String line) {//time=⽇期String
String time =line.split(",")[1].trim();//截取最后的" +0800"
final int f = time.indexOf(" ");
String time1= time.substring(0, f);
java中split的用法Date date=parseDateFormat(time1);returndateformat1.format(date);
}//把String类型转换成Date类型
private staticDate parseDateFormat(String string){
Date parse= null;try{
parse= FORMAT.parse(string);//parse()⽅法,把String型的字符串转换成特定格式的date类型
}catch(Exception e){
e.printStackTrace();
}returnparse;
}//Day
private staticString parseDay(String line) {
String day=line.split(",")[2].trim();returnday;
}//Traffic
private staticString parseTraffic(String line) {
String traffic= line.split(",")[3].trim();returntraffic;
}//Type
private staticString parseType(String line) {
String type= line.split(",")[4].trim();returntype;
}//Id
private staticString parseId(String line) {
String id=line.split(",")[5].trim();returnid;
}/** Mapper
* 把需要的信息从原始⽇志中提取出来,根据提取出来的信息做精细化操作*/
public static class Map extendsMapper{public static Text word = newText();public voidmap(LongWritable key,Text
value,Context context)throwsIOException, InterruptedException{
String String();
String arr[]=parse(line);
word.set(arr[0]+"\t"+arr[1]+"\t"+arr[2]+"\t"+arr[3]+"\t"+arr[4]+"\t"+arr[5]+"\t");
context.write(());
}
}public static class Reduce extendsReducer{public void reduce(Text key, Iterablevalues,Context context)throwsIOException, InterruptedException {
context.write(key, ());
}
}public static void main(String[] args) throwsException{
Path inputpath=newPath(INPUT_PATH);
Path outputpath=newPath(OUTPUT_PATH);
Configuration conf=newConfiguration();
System.out.println("Start");
Job Instance(conf);
job.setJarByClass(DataClean.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
FileInputFormat.addInputPaths(job, INPUT_PATH);
FileOutputFormat.setOutputPath(job,outputpath);boolean flag = job.waitForCompletion(true); System.out.println(flag);
}
}
知识点1:SimpleDateFormat的⽤法
SimpleDateFormat⽤于格式化时间
实例::::::::::::::::::::::::::::::::::::::::::::::::::::
import java.util.Date;
SimpleDateFormat;
public class SimpleDateFormat1 {
public static void main(String[] args){
Date date = new Date();
String dat = String();
System.out.println(dat);
String strDateFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
System.out.println(sdf.format(date));
}
} ::::::::::::::::::::::::::::::::::::::::::::::::::::::
输出结果:
Tue Nov 19 18:55:29 CST 2019
2019-11-19 18:55:29
知识点2:lastIndexOf()⽅法和indexOf()⽅法⽐较
lastIndexOf()⽅法,返回⼦字符串最后出现的位置。没有到,则返回 -1。
如:"ABCDABCD".lastIndexOf("BC"); 返回5
"ABCDABCD".lastIndexOf("DE"); 返回-1
indexOf()⽅法返回⼦字符串第⼀次出现字符位置。没有到,则返回 -1。
如:"ABCDABCD".indexOf("BC"); 返回1
"ABCDABCD".indexOf("B"); 返回1
"ABCDABCD".indexOf("DE"); 返回-1
导⼊Hive语句:
hive数据库的操作:
hive> create table ifnot exists data(>dip string,>dtime string,>dday string,>dtraffic bigint,>dtype string,>did string)> row format delimited fields terminated by ',' lines terminated by '\n';
[root@localhost 桌⾯]# hadoop fs-get hdfs://localhost:9000/testhdfs1026/run/ /usr/local
hive> load data local inpath '/usr/'into table data;
hive> select * from data limit 3;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论