通过五个视频网站数据,分析统计节目受欢迎度

news/2024/5/20 12:31:41/文章来源:https://blog.csdn.net/ZoeYen_/article/details/79047130

一、需求
自定义输入格式 完成统计任务 输出多个文件

输入数据:5个网站的 每天电视剧的 播放量 收藏数 评论数 踩数 赞数

输出数据:按网站类别 统计每个电视剧的每个指标的总量

任务目标:自定义输入格式 完成统计任务 输出多个文件

二、数据

部分数据

这里写图片描述

三、思路

第一步:定义一个电视剧热度数据的bean。

第二步:定义一个读取热度数据的InputFormat类。

第三步:写MapReduce统计程序

第四步:上传tvplay.txt数据集到HDFS,并运行程序

四、代码

1.利用WritableComparable接口,自定义一个TVWritable类,实现WritableComparable类,将各个参数封装起来,便于计算。

package com.pc.hadoop.pc.tv;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;import org.apache.hadoop.io.WritableComparable;public class TVWritable implements WritableComparable{//定义5个成员变量private int view;private int collection;private int comment;private int diss;private int up;//构造函数public TVWritable(){}//定义一个set方法,用this关键字对封装好的数据进行引用public void set(int view,int collection,int comment, int diss,int up){this.view = view;this.collection = collection;this.comment = comment;this.diss = diss;this.up = up;}//使用get和set对封装好的数据进行存取public int getView(){return view;}public void setView(int view){this.view = view;}public int getCollection(){return collection;}public void setCollection(int collection){this.collection = collection;}public int getComment(){return comment;}public void setComment(int comment){this.comment = comment;}public int getDiss(){return diss;}public void setDiss(int diss){this.diss = diss;}public int getUp(){return up;}public void setUp(int up){this.up = up;}//实现WritableComparaqble的redafields()方法,以便该数据能被序列化后完成网络传输或文件输入。@Overridepublic void readFields(DataInput in) throws IOException {// TODO Auto-generated method stubview = in.readInt();collection = in.readInt();comment = in.readInt();diss = in.readInt();up = in.readInt();}//实现WritableComparaqble的write()方法,以便该数据能被反序列化后完成网络传输或文件输入。@Overridepublic void write(DataOutput out) throws IOException {// TODO Auto-generated method stubout.writeInt(view);out.writeInt(collection);out.writeInt(comment);out.writeInt(diss);out.writeInt(up);}//使用compareTo对其中的数据进行比较@Overridepublic int compareTo(Object o) {// TODO Auto-generated method stubreturn 0;}}

2.自定义一个TVInputFormat类取继承FileInputFormat文件输入格式这个父类,然后对createRecordReader()方法进行重写,其实质则是重写TVRecordReader()这个方法,得到其返回值,利用TVRecordReader()这个方法去继承RecordReader()这个方法。

package com.pc.hadoop.pc.tv;import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.hadoop.util.LineReader;public class TVInputFormat extends FileInputFormat<Text,TVWritable>
{protected boolean isSplitable(){return false;}@Overridepublic RecordReader<Text, TVWritable> createRecordReader(InputSplit inputsplit, TaskAttemptContext context) throws IOException, InterruptedException {// TODO Auto-generated method stubreturn new TVRecordReader();}public static class TVRecordReader extends RecordReader<Text,TVWritable>{public LineReader in; //自定义行读取器public Text lineKey; //声明key类型public TVWritable lineValue; //自定义valuepublic Text line; //每行数据类型//@Overridepublic void close() throws IOException {// TODO Auto-generated method stubif(in != null){in.close();}}//获取当前key@Overridepublic Text getCurrentKey() throws IOException, InterruptedException {// TODO Auto-generated method stubreturn lineKey;}//获取当前value@Overridepublic TVWritable getCurrentValue() throws IOException, InterruptedException {// TODO Auto-generated method stubreturn lineValue;}//获取当前进程@Overridepublic float getProgress() throws IOException, InterruptedException {// TODO Auto-generated method stubreturn 0;}//初始化@Overridepublic void initialize(InputSplit inputsplit, TaskAttemptContext context) throws IOException, InterruptedException {// TODO Auto-generated method stubFileSplit split = (FileSplit) inputsplit;//获取分片内容Configuration job = context.getConfiguration();//读取配置信息Path file = split.getPath();//获取路径FileSystem fs = file.getFileSystem(job);//获取文件系统FSDataInputStream filein = fs.open(file);//通过文件系统打开文件,对文件进行读取in = new LineReader(filein,job);lineKey = new Text();//新建一个Text实例作为自定义输入格式的keylineValue = new TVWritable();line = new Text();}@Overridepublic boolean nextKeyValue() throws IOException, InterruptedException {// TODO Auto-generated method stubint lineSize = in.readLine(line);if(lineSize == 0)return false;//读取每行数据解数组iString[] i = line.toString().split("\t");if(i.length != 7){throw new IOException("Invalid record received");}//自定义key和value的值lineKey.set(i[0]+"\t"+i[1]);//电视剧名称和所属视频网站lineValue.set(Integer.parseInt(i[2].trim()), Integer.parseInt(i[3].trim()), Integer.parseInt(i[4].trim()), Integer.parseInt(i[5].trim()), Integer.parseInt(i[6].trim() ));return true;}}}

3.使用MapperReducer对输入的数据进行进行相应的处理输出想要得到的结果。
在reduce在定义一个多输出的对象MultipleOutputs

/*** @input Params Text TvPlayData* @output Params Text TvPlayData* @author yangjun* @function 直接输出*/public static class TVPlayMapper extendsMapper<Text, TVWritable, Text, TVWritable> {@Overrideprotected void map(Text key, TVWritable value, Context context)throws IOException, InterruptedException {context.write(key, value);}}/*** @input Params Text TvPlayData* @output Params Text Text* @author yangjun* @fuction 统计每部电视剧的 点播数 收藏数等  按source输出到不同文件夹下*/public static class TVPlayReducer extendsReducer<Text, TVWritable, Text, Text> {private Text m_key = new Text();private Text m_value = new Text();private MultipleOutputs<Text, Text> mos;protected void setup(Context context) throws IOException,InterruptedException {mos = new MultipleOutputs<Text, Text>(context);}//将 MultipleOutputs 的初始化放在 setup() 中,因为在 setup() 只会被调用一次
//定义reduce() 方法里的 multipleOutputs.write(…)。你需要把以前的 context.write(…) 替换成现在的这个protected void reduce(Text Key, Iterable<TVWritable> Values,Context context) throws IOException, InterruptedException {int view = 0;int collection = 0;int comment = 0;int diss = 0;int up = 0;for (TVWritable a:Values) {view += a.getView();collection += a.getCollection();comment +=a.getComment();diss += a.getDiss();up += a.getUp();}//tvname  sourceString[] records = Key.toString().split("\t");// 1优酷2搜狐3土豆4爱奇艺5迅雷看看String source = records[1];// 媒体类别m_key.set(records[0]);m_value.set(view+"\t"+collection+"\t"+comment+"\t"+diss+"\t"+up);if (source.equals("1")) {mos.write("youku", m_key, m_value);} else if (source.equals("2")) {mos.write("souhu", m_key, m_value);} else if (source.equals("3")) {mos.write("tudou", m_key, m_value);} else if (source.equals("4")) {mos.write("aiqiyi", m_key, m_value);} else if (source.equals("5")) {mos.write("xunlei", m_key, m_value);}}protected void cleanup(Context context) throws IOException,InterruptedException {mos.close();   //关闭 MultipleOutputs,也就是关闭 RecordWriter,并且是一堆 RecordWriter,因为这里会有很多 reduce 被调用。}}

4 运行run函数对作业进行运行,并自定义输出MultipleOutputs函数调用addNameoutput方法对其进行设置多路径的输出。

@Overridepublic int run(String[] args) throws Exception {Configuration conf = new Configuration();// 配置文件对象Path mypath = new Path(args[1]);FileSystem hdfs = mypath.getFileSystem(conf);// 创建输出路径if (hdfs.isDirectory(mypath)) {hdfs.delete(mypath, true);}Job job = new Job(conf, "tvplay");// 构造任务job.setJarByClass(TVplay.class);// 设置主类job.setMapperClass(TVPlayMapper.class);// 设置Mapperjob.setMapOutputKeyClass(Text.class);// key输出类型job.setMapOutputValueClass(TVWritable.class);// value输出类型job.setInputFormatClass(TVInputFormat.class);//自定义输入格式job.setReducerClass(TVPlayReducer.class);// 设置Reducerjob.setOutputKeyClass(Text.class);// reduce key类型job.setOutputValueClass(Text.class);// reduce value类型// 自定义文件输出格式,通过路径名(pathname)来指定输出路径MultipleOutputs.addNamedOutput(job, "youku", TextOutputFormat.class,Text.class, Text.class);MultipleOutputs.addNamedOutput(job, "souhu", TextOutputFormat.class,Text.class, Text.class);MultipleOutputs.addNamedOutput(job, "tudou", TextOutputFormat.class,Text.class, Text.class);MultipleOutputs.addNamedOutput(job, "aiqiyi", TextOutputFormat.class,Text.class, Text.class);MultipleOutputs.addNamedOutput(job, "xunlei", TextOutputFormat.class,Text.class, Text.class);FileInputFormat.addInputPath(job, new Path(args[0]));// 输入路径FileOutputFormat.setOutputPath(job, new Path(args[1]));// 输出路径job.waitForCompletion(true);return 0;}public static void main(String[] args) throws Exception {String[] args0 = { "hdfs://pc1:9000/home/hadoop/tvplay/tvplay.txt","hdfs://pc1:9000/home/hadoop/tvplay/out/" };int ec = ToolRunner.run(new Configuration(), new TVplay(), args0);//public static int run(Configuration conf,Tool tool, String[] args),可以在job运行的时候指定配置文件或其他参数//这个方法调用tool的run(String[])方法,并使用conf中的参数,以及args中的参数,而args一般来源于命令行。System.exit(ec);}

五、运行

在myeclipse上运行:
1.创建目录、home/hadoop/tvplay,将数据文件上传至目录下

这里写图片描述

2.右键->run as->run on hadoop

控制台显示信息
这里写图片描述

右键refresh

这里写图片描述

部分结果
这里写图片描述

.在hdfs上运行:

1.修改args0的两个路径,或者删除运行结果的out文件夹

2.将三个java文件打包到本机,右键->export->JAR file
这里写图片描述

3.将jar包上传到hdfs的文件系统

这里写图片描述

4.运行程序

[hadoop@pc1 hadoop]$ bin/hadoop jar tvplay.jar com.pc.hadoop.pc.tv.TVplay /home/hadoop/tvplay/tvplay.txt /home/hadoop/tvplay/out

这里写图片描述

5.查看运行结果

这里写图片描述

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_843156.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漂亮的网站底部代码_WP主题开发12:wordpress主题trans主题底部代码的修改

在前面的章节中&#xff0c;我们完成了wordpress主题trans首页动态模板的头部、左侧边栏和右侧边栏的动态数据的调用&#xff0c;现在就剩下trans模板底部没有修改了。今天&#xff0c;我们就要对trans模板的底部的代码进行修改。我们看一下trans主题的静态模板(如下图)&#x…

网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置) 我们只能通过各种系统日志来分析网站的运行状况,对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析

网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)我们只能通过各种系统日志来分析网站的运行状况&#xff0c;对于部署在IIS上的网站来说&#xff0c;IIS日志提供了最有价值的信息&#xff0c;我们可以通过它来分析网站的响应情况&#xff0c;来判断网站是否有性能问…

python爬取百度学术文献搜索引擎_通用爬虫探索(一):适用一般网站的爬虫

这是笔者参加今年的泰迪杯C题的论文简化版。虽然最后只评上了一个安慰奖&#xff0c;但个人感觉里边有些思路对爬虫工作还是有些参加价值的。所以还是放出来供大家参考一下。简介#一个爬虫可以分为两个步骤&#xff1a;1.把网页下载下来&#xff1b;2.从网页中把所需要的信息抽…

解决Community Server中网站域名被去掉了www的问题

这几天把Community Server发布到网站上&#xff0c;但是奇怪的是每次一访问&#xff0c;网站地址就从输入www.mySite.com/cs变成了mySite.com/cs&#xff0c;导致访问不能访问。经过了3天屡战屡败、屡败屡战之后&#xff0c;终于从国外的一个论坛上找到了答案。 原来是需要配置…

市场调研琐事一堆?这几个好用设计网站快收藏起来用

市场营销工作的内容主要是通过对市场调研&#xff0c;分析消费者需求&#xff0c;根据需求来制定市场运营的策略&#xff0c;以及抓好各项策略的落实&#xff0c;进而实现对市场进行全周期的。在各项具体琐碎工作中&#xff0c;学会运用以下4个神仙网站&#xff0c;能够让工作效…

推荐学习产品经理入门知识的5个网站

在万众创业的时代&#xff0c;有很多公司在创建从0到1的产品&#xff0c;对产品经理的需求日益增加&#xff0c;对于想要转型做产品经理的人来说&#xff0c;在学习入门知识的同时&#xff0c;也要去了解产品经理工作常用工具&#xff0c;这里推荐5个常用网站。 亿图图示&…

网站上传服务器浏览器打不开,网站发布或自己上传程序后,网站打不开的原因有哪些?...

网站发布或自己上传程序后&#xff0c;网站打不开的原因有哪些&#xff1f;网站打不开原因大体有这几种&#xff1a;服务器问题&#xff0c;域名绑定问题&#xff0c;服务器没有绑定上域名&#xff0c;国内主机未备案问题&#xff0c;空间默认首页问题、程序不支持、数据库问题…

(运维日志)同一服务器架设多个域名网站

部署环境说明:window server 2008 IIS 7.0 Step One 多个域名解析到服务器ip上 Step Two 创建网站,设置网站绑定 操作过程: 选择网站--->点击右键,选择网站绑定--->点击网站绑定的编辑按钮&#xff0c;弹出编辑界面 --->设置端口为80 &#xff0c;并输入域名&#…

网站集群架构搭建

不懂网站搭建Q我 3008557816

服务器搭建网站完整教程(宝塔面板+WORDPRESS)

服务器最大的用途&#xff0c;就是可以搭建网站&#xff0c;许多人都认为搭建网站是一件很难的事情&#xff0c;因为包含许多的比较专业东西&#xff0c;比如服务器、编程之类的&#xff0c;确实&#xff0c;在几年前是这样的&#xff0c;普通人想要自己做一个网站太难了 但是…

各大电子商务网站的站内搜索比较,因为要做站内搜索,所以前去观摩下

参考的网站有&#xff1a;京东商城&#xff0c;亚马逊&#xff0c;苏宁易购&#xff0c;易迅网&#xff0c;凡客诚品&#xff0c;1号店&#xff0c;新蛋中国&#xff0c;库巴&#xff0c;好孩子&#xff0c;QQ商城&#xff0c;当当网&#xff0c;麦包包等网站&#xff0c;另外淘…

(转自startos门户网站)ubuntu局域网共享

buntu 12.04安装和设置Samba实现网上邻居共享 Samba 是一款功能强大的共享工具&#xff0c;可以实现与windows的共享&#xff0c;就是我们经常在windows计算机之间使用的网上邻居功能&#xff0c;可以共享文件和打印机等。今天要介绍的是在 ubuntu 12.04 中安装和设置&#xff…

LAMP网站的CACHE机制概要

感觉这个让整个思路更清晰&#xff0c; 优化的细节更具体和有可行性。 并且可以根据不同的方案进行剪裁 ~~~~ http://xlinblog.sinaapp.com/?p2085 网站缓存主要分为五部分 服务器缓存&#xff1a;主要是基于web反向代理的静态服务器nginx和squid&#xff0c;还有apache2的mod…

如何对SharePoint网站进行预热(warmup)以提高响应速度

问题描述 SharePoint Server是一个易于使用的协作平台&#xff0c;目前在越来越多的企业中被应用开来。SharePoint Server是通过网站的形式向最终用户提供服务的&#xff0c;而这个网站是基于ASP.NET 的技术实现的。由于ASP.NET技术的特点&#xff0c;网站启动之后&#xff0c;…

在SharePoint Server 2010中更改“我的网站”

在安装SharePoint Server 2010的时候&#xff0c;创建的第一个站点是一个“NetBIOS名称”的网站&#xff0c;而这个时候&#xff0c;“我的网站”&#xff08;或称“个人网站”&#xff09;&#xff0c;也是基于此NetBIOS名称的&#xff0c;例如&#xff0c;如果你的计算机名称…

常用技术社区和网站总结

大多数的程序员都有自己经常上的一些技术网站&#xff0c;不管是学习还是咨询问题。我经常上的一些网站主要有以下几个&#xff0c;现在总结出来跟大家分享一下&#xff0c;也在这里作为记录。 中文社区 名称Logo链接描述博客园http://www.cnblogs.com/这是我上的最多的技术网站…

Nginx简单实现网站的负载均衡

在大型网站搭建时&#xff0c;都会考虑如果用户量每日不断增加&#xff0c;大量的并发访问&#xff0c;会不会给网站、数据库带来崩盘的灾难。今天我们就讨论一下&#xff0c;现实中如何解决这些问题的一套最为容易实现的方案。 控制并发&#xff0c;大家都会首先考虑的就是分布…

SpringBoot开发一个简单的网站

project&#xff1a;springboot-02&#xff01;&#xff01;&#xff01; 一、模拟一个数据库 pojo.Department Data AllArgsConstructor NoArgsConstructor public class Department {private Integer id;private String departmentName;} pojo.Employee Data NoArgsConst…

新闻网站项目静态页面--登录页

外联css login.css&#xff1a; body{background-image:url(../images/login/backgroundimg.png);background-size: cover;background-repeat: no-repeat; } .ui.basic.segment.container.content{width: 425px;margin-left: 50%;margin-top: 389px; } .ui.header{color:red;fo…

BugKu-----程序员本地网站

title: BugKu---------备份是个好习惯 date: 2021-06-23 18:48:44 description: 前言:零度安全搭建博客后的第N篇文章 top: categories: BugKu刷题 tags: 网络安全BugKu BugKu-----程序员本地网站 题目 解题思路 ​ 从本地两个字可以才想到可能是修改X-Forword-for的信息 解…