今天又从电脑里面扒拉出来一个以前的一个实验程序,关于hadoop的,使用Java MapReduce原理编程, 某新闻平台用户点击视频统计分析,
放在硬盘里的数据可能没有价值,但是经过大数据分析的数据可能会产生巨大价值
1 数据统计原理分析本次统计数据量:1048576条
target:当前推荐的视频是否被用户点击了
guid:当前用户的id
这是统计数据目标:
曝光的视频数量: 即用户guid出现的次数
点击次数: 计算当前用户 target=1的次数
点击率: 点击次数/曝光的视频数量
2 MapReduce统计原理 3 代码分析yarn jar /usr/local/hadoop-jar/clickCount/clickCount.jar com.hadoop.ClickCountDriverClickCountDriver.java
package com.hadoop;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
// 主类:指定Job参数并提交job
public class ClickCountDriver {
public static void main(String[] args) throws Exception {
// 创建一个 Job
Configuration conf = new Configuration();
// 指定一个 Job
Job job = Job.getInstance(conf);
// 指定任务入口----任务主程序
job.setJarByClass(ClickCountDriver.class);
// 指定 Job 的mapper类
job.setMapperClass(ClickCountMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// 指定 Job 的reduce
job.setReducerClass(ClickCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
// 指定任务的输入和输出
// 要处理的所有文件,所在文件夹路径
FileInputFormat.setInputPaths(job, new Path("/input/sample_train.csv"));
// 处理结果存放在文件举哀路径(如已存在,需删除)
FileOutputFormat.setOutputPath(job, new Path("/output/clickCount"));
// 向 yarn 集群提交job任务 true:打印日志
job.waitForCompletion(true);
}
}
ClickCountMapper.java
package com.hadoop; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class ClickCountMapper extends MapperClickCountReducer.java{ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { if (key.get() == 0) { return; } String line = value.toString(); String[] data = line.split(","); context.write(new Text(data[5]), new IntWritable(Integer.parseInt(data[1]))); } }
package com.hadoop; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; import java.math.BigDecimal; class ClickCountReducer extends Reducer统计结果{ @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { System.out.println(key + ", " + values); int clickNum = 0; int sum = 0; for (IntWritable value : values) { if (value.get() == 1) { clickNum++; } sum++; } double res = new BigDecimal((float) clickNum / sum).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); context.write(key, new Text("点击次数:" + clickNum + "曝光的视频数量:" + sum + ",点击率:" + res)); } }
点击次数:837曝光的视频数量:15394,点击率:0.05
用户id 点击视频次数 视频曝光次数 点击概率
000012b09359ac17f324327ac6e600a5 点击次数:0曝光的视频数量:2,点击率:0.0
0000c4eb1da2bae0e94378040912d792 点击次数:0曝光的视频数量:2,点击率:0.0
0000d6629ab40e47a778c8793c937f0b 点击次数:0曝光的视频数量:1,点击率:0.0
00013192d769aaa12bfcdf95dd8ca28d 点击次数:0曝光的视频数量:9,点击率:0.0
0001cbb2efdb8713ef8f59ae70163080 点击次数:0曝光的视频数量:1,点击率:0.0
0001e51aba755cd8e61c4c70966278a7 点击次数:2曝光的视频数量:27,点击率:0.07
00029c2fa4ea7c0321f96489cc644bc3 点击次数:10曝光的视频数量:21,点击率:0.48
00035974e51a890b7ea5bec917d8b9f9 点击次数:0曝光的视频数量:5,点击率:0.0
00037b61eb3e4b32dca07aba0b3f21fb 点击次数:0曝光的视频数量:14,点击率:0.0
00039d6a46ea6e9988b9f3b75ed9f24b 点击次数:0曝光的视频数量:1,点击率:0.0
..............
..............
可以得出该平台曝光的视频中点击率过低。



