大数据 Spark :利用电影观看记录数据,进行电影推荐 | 原力计划

作者 | lomtom

责编 | 王晓曼

出品 | CSDN博客

准备

 

1、任务描述

在推荐领域有一个著名的开放测试集,下载链接是:http://grouplens.org/datasets/movielens/,该测试集包含三个文件,分别是ratings.dat、sers.dat、movies.dat,具体介绍可阅读:README.txt。

请编程实现:通过连接ratings.dat和movies.dat两个文件得到平均得分超过4.0的电影列表,采用的数据集是:ml-1m。


2、数据下载

下载(大小约为5.64M)后解压,会有movies.dat、ratings.dat、ReadMe、users.dat四个文件。

3、部分数据展示

movies.dat 部分数据:

MovieID::Title::Genres1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3::Grumpier Old Men (1995)::Comedy|Romance
4::Waiting to Exhale (1995)::Comedy|Drama
5::Father of the Bride Part II (1995)::Comedy
6::Heat (1995)::Action|Crime|Thriller
7::Sabrina (1995)::Comedy|Romance
8::Tom and Huck (1995)::Adventure|Children's
9::Sudden Death (1995)::Action
10::GoldenEye (1995)::Action|Adventure|Thriller
11::American President, The (1995)::Comedy|Drama|Romance
12::Dracula: Dead and Loving It (1995)::Comedy|Horror
13::Balto (1995)::Animation|Children's
14::Nixon (1995)::Drama
15::Cutthroat Island (1995)::Action|Adventure|Romance
16::Casino (1995)::Drama|Thriller
17::Sense and Sensibility (1995)::Drama|Romance
18::Four Rooms (1995)::Thriller
19::Ace Ventura: When Nature Calls (1995)::Comedy
20::Money Train (1995)::Action
ratings.dat 部分数据:
UserID::MovieID::Rating::Timestamp1::1193::5::978300760
1::661::3::978302109
1::914::3::978301968
1::3408::4::978300275
1::2355::5::978824291
1::1197::3::978302268
1::1287::5::978302039
1::2804::5::978300719
1::594::4::978302268
1::919::4::978301368
1::595::5::978824268
1::938::4::978301752
1::2398::4::978302281
1::2918::4::978302124
1::1035::5::978301753
1::2791::4::978302188
1::2687::3::978824268
1::2018::4::978301777
1::3105::5::978301713
1::2797::4::978302039

实操

 

将我们刚刚下载的数据存放到我们的项目中,项目目录结构如下,创建我们的主程序 movie.scala。


1、设置输入输出路径

这里使用数组保存我们的输入输出文件,方便后面的修改以及使用:

    val files = Array("src/main/java/day_20200425/data/movies.dat","src/main/java/day_20200425/data/ratings.dat","src/main/java/day_20200425/output")

2、配置  spark

val conf = new SparkConf().setAppName("SparkJoin").setMaster("local")
val sc = new SparkContext(conf)

3、读取 Rating 文件

读取 Ratings.dat 文件,根据其内容格式我们将其用::分隔开两个部分,最后计算出电影评分。

 // Read rating  fileval textFile = sc.textFile(files(1))//提取(movieid, rating)val rating = textFile.map(line => {val fileds = line.split("::")(fileds(1).toInt, fileds(2).toDouble)})//get (movieid,ave_rating)val movieScores = rating.groupByKey().map(data => {val avg = data._2.sum / data._2.size(data._1, avg)})
4、读取 movie 文件

Join 操作的结果 (ID,((ID,Rating),(ID,MovieName))),RDD的keyBy(func)实际上是为每个 RDD 元素生成一个增加了 ke y的 <key,value>。

由于有时候数据的列数很多,不只是按一项作为 key 来排序,有时候需要对其中两项进行排序,Spark 的 RDD 提供了 keyBy 的方法。

 val movies = sc.textFile(files(0))val movieskey = movies.map(line => {val fileds = line.split("::")(fileds(0).toInt, fileds(1)) //(MovieID,MovieName)}).keyBy(tup => tup._1)

5、保存结果

保存评分大于4的电影:

val result = movieScores.keyBy(tup => tup._1).join(movieskey).filter(f => f._2._1._2 > 4.0).map(f => (f._1, f._2._1._2, f._2._2._2))
//     .foreach(s =>println(s))val file = new File(files(2))if(file.exists()){deleteDir(file)}result.saveAsTextFile(files(2))

6、结果

它会自动生成 output 文件夹,里面有四个文件,_SUCECCESS 代表成功的意思,里面没有任何内容,part-00000 就是我们的需要的数据。

部分结果:

(1084,4.096209912536443,Bonnie and Clyde (1967))
(3007,4.013559322033898,American Movie (1999))
(2493,4.142857142857143,Harmonists, The (1997))
(3517,4.5,Bells, The (1926))
(1,4.146846413095811,Toy Story (1995))
(1780,4.125,Ayn Rand: A Sense of Life (1997))
(2351,4.207207207207207,Nights of Cabiria (Le Notti di Cabiria) (1957))
(759,4.101694915254237,Maya Lin: A Strong Clear Vision (1994))
(1300,4.1454545454545455,My Life as a Dog (Mitt liv som hund) (1985))
(1947,4.057818659658344,West Side Story (1961))
(2819,4.040752351097178,Three Days of the Condor (1975))
(162,4.063136456211812,Crumb (1994))
(1228,4.1875923190546525,Raging Bull (1980))
(1132,4.259090909090909,Manon of the Spring (Manon des sources) (1986))
(306,4.227544910179641,Three Colors: Red (1994))
(2132,4.074074074074074,Who's Afraid of Virginia Woolf? (1966))
(720,4.426940639269406,Wallace & Gromit: The Best of Aardman Animation (1996))
(2917,4.031746031746032,Body Heat (1981))
(1066,4.1657142857142855,Shall We Dance? (1937))
(2972,4.015384615384615,Red Sorghum (Hong Gao Liang) (1987))

你可能会遇到的问题

 

1、问题一:结果输出目录已存在

描述

Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory file:/D:/Projects/JAVA/Scala/src/main/java/day_20200425/data/output already exist

分析:由于运行,然后输出文件夹已存在,则需要删除该目录

解决:方法一:手动删除;方法二:加入以下代码:

1、主程序中val file = new File(files(2))if(file.exists()){deleteDir(file)}2、删除函数/*** https://www.cnblogs.com/honeybee/p/6831346.html* 删除一个文件夹,及其子目录** @param dir 目录*/def deleteDir(dir: File): Unit = {val files = dir.listFiles()files.foreach(f => {if (f.isDirectory) {deleteDir(f)} else {f.delete()println("delete file " + f.getAbsolutePath)}})dir.delete()println("delete dir " + dir.getAbsolutePath)}

2、问题二:缺少 hadoop 环境变量

描述:

ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path java.io.IOException
分析:

在 Windows 环境下没有配置 hadoop 环境的原因。

解决:

下载:https://github.com/amihalik/hadoop-common-2.6.0-bin,并且将其bin目录配置为系统的环境变量(path),然后再代码中加入以下代码,例如我的目录为E:\\Program\\hadoop\\hadoop-common-2.6.0-bin,那么则需要加入:

 System.setProperty("hadoop.home.dir", "E:\\Program\\hadoop\\hadoop-common-2.6.0-bin")

版权声明:本文为CSDN博主「lomtom」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_41929184/article/details/105762156

推荐阅读
  • 如何成为一名黑客?

  • 一篇与众不同的 String、StringBuilder 和 StringBuffer 详解

  • 干货 | 大白话彻底搞懂 HBase RowKey 详细设计

  • 发送0.55 ETH花费近260万美元!这笔神秘交易引发大猜想

  • Python 爬取周杰伦《Mojito》MV 弹幕,这个评论亮了!

  • 谷歌 Chrome 将弃用“黑名单”,“Master/Slave”主从模式也要换名?

真香,朕在看了!

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

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

相关文章

大家都关注的Serverless,阿里怎么做的?

作者|陈仲寅&#xff08;张挺&#xff09; 出品|阿里巴巴新零售淘系技术部 本文是阿里巴巴前端技术专家-张挺&#xff0c;在 JSConf China 「中国开发者大会」上分享的《面向传统&#xff0c;Serverless 进化之路》&#xff0c;主要讲述阿里集团内部逐步迁移到 Serverless 体系…

我的第一个Go程序

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 文章目录介绍技术网站入门程序介绍 &#x1f4a1;官网介绍 Go 是一门开放源代码的编程语言&#xff0c;可轻松构建简单&#xff0c;可靠且高效的软件。 &#x1f4a1;百度百科 Go&#xff08;又称 Golang&#xff09;…

2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

“不是任何一朵云都能撑住这个流量。中国有两朵云&#xff0c;一朵是阿里云&#xff0c;一朵叫其他云。”11月11日晚&#xff0c;阿里巴巴集团CTO张建锋表示&#xff0c;“阿里云不一样&#xff0c;10年前我们从第一行代码写起&#xff0c;构建了中国唯一自研的云操作系统飞天。…

阿里CTO张建锋:明年双11将大规模应用含光AI芯片

11月11日晚&#xff0c;阿里巴巴集团CTO张建锋宣布重磅消息&#xff0c;明年双11将大规模应用平头哥自研的含光AI芯片。 达摩院研发的AI技术已应用于天猫双11的各个场景。未来&#xff0c;这些人工智能应用将会越来越多跑在阿里自研的芯片上。 2019年9月25日杭州云栖大会上&am…

shell脚本报错“^M: bad interpreter”解决方法

文章目录1. 现象2. 先编辑脚本3. 脚本观察4. 脚本格式调整5. 脚本格式查看6. 保存脚本7. 重新运行脚本1. 现象 bash: ./ry.sh: /bin/sh^M: bad interpreter: No such file or directory2. 先编辑脚本 # 首先编辑脚本 [rootnode2 ruoyi]# vim ry.sh# 3. 脚本观察 这时会看到文…

深入解析final关键字的用法

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 个人博客地址&#xff1a;http://blog.breez.work 文章目录介绍解析final属性final方法final参数final类介绍 final用于声明属性【属性不可变】、方法【方法不可覆盖】、类&#xff08;除了抽象类&#xff09;【类不…

出道50年+!乘风破浪的编程语言们,能二次翻红吗?

来源 | 编程技术宇宙责编| Carol继上次哈希表华山论剑之后&#xff0c;比特宇宙编程语言联合委员会又来搞事情了。委员会要做一套全新的系统&#xff0c;涉及后端、前端、客户端三大块&#xff0c;为选择什么样的语言组合拿不定主意。为了体现公平&#xff0c;委员会特举办一次…

Spotify如何使用Cassandra实现个性化推荐

在Spotify我们有超过6000万的活跃用户&#xff0c;他们可以访问超过3000万首歌曲的庞大曲库。用户可以关注成千上万的艺术家和上百个好友&#xff0c;并创建自己的音乐图表。在我们的广告平台上&#xff0c;用户还可以通过体验各种音乐宣传活动&#xff08;专辑发行&#xff0c…

RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 多机版本)

接上一篇&#xff1a;RuoYi-Vue 部署 Linux环境 若依前后端分离项目&#xff08;jar包nginx 单机版本&#xff09; 前端和后端不在一个服务器上&#xff0c;如何部署呢&#xff1f; 文章目录1. 服务器和软件部署2. 后端部署3. 前端部署4. 登录5. 效果图1. 服务器和软件部署 服…

三个不同线程顺序打印ABC十种写法【并发编程JUC】

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 个人博客地址&#xff1a;http://www.breez.work &#x1f4d6;写法一&#xff1a;使用信号量Semaphore public class Foo {private Semaphore semaphoreB new Semaphore(0);private Semaphore semaphoreC new Sem…

技术直播:数据科学到底该怎么“玩”?

90年代初&#xff0c;王健林抓住的房地产的机遇&#xff0c;现在才敢说“一个亿的小目标”&#xff1b;千禧年后 &#xff0c;“马爸爸”抓住了电商的机遇&#xff0c;现在才能说“我对钱没有兴趣”。今年由于特殊情况&#xff0c;加速了远程办公、在线教育和在线医疗的发展&am…

Apache Flink 为什么能够成为新一代大数据计算引擎?

众所周知&#xff0c;Apache Flink&#xff08;以下简称 Flink&#xff09;最早诞生于欧洲&#xff0c;2014 年由其创始团队捐赠给 Apache 基金会。如同其他诞生之初的项目&#xff0c;它新鲜&#xff0c;它开源&#xff0c;它适应了快速转的世界中更重视的速度与灵活性。 大数…

超燃!支付宝技术双11纪录片《一心一役》全球独家首发

​和过去10年一样&#xff0c;2019年天猫双11又创造了一个全新的纪录。 这个数字背后&#xff0c;是数代支付宝工程师们殚精竭虑、不断突破技术难关。 今年双11之前&#xff0c;小编邀请到11位经历双11的技术同学口述实录&#xff0c;特别筹备了纪录片《一心一役》&#xff0c…

RabbitMQ消息队列简单异步邮件发送和订单异步处理实战【应用解耦】【异步削峰】

介绍 &#x1f4d6;源码地址&#xff1a; https://gitee.com/breez/mq-shop 介绍 使用RabbitMQ消息队列异步发送短信和邮件、订单异步处理【流量削峰】 软件架构 技术栈 序号名称1SpringBoot2SpringMVC3Mybatis plus4RabbitMQ5SpringBoot Mail 特点: 邮件发送的封装三大发…

秋名山老司机从上车到翻车的悲痛经历,带你深刻了解什么是 Spark on Hive!| 原力计划...

作者 | Alice菌责编 | 夕颜出品 | CSDN博客本篇博客将为大家分享的内容是如何实现Spark on Hive&#xff0c;即让Hive只作为存储角色&#xff0c;Spark负责sql解析优化&#xff0c;执行…话不多说&#xff0c;直接上车&#xff01;上车前需知Spark on hive 与 hive on spark 的…

从电商到软件市场,阿里双11战火蔓延

2019年“双十一”&#xff0c;是阿里天猫奋战的第11个年头&#xff0c;更是阿里在电商行业的一个重要的里程碑。今年&#xff0c;整个阿里系也在“一心一役”全面出击&#xff0c;作为阿里旗下的重要大将——阿里云也加入了这场购物狂欢&#xff0c;将火热的购物氛围从C端消费者…

RuoYi-Cloud 部署篇_01(linux环境 mysql+nginx版本)

文章目录一、基础准备1. 技术选型2. 源码克隆3. 安装依赖4. 将 RuoYi-Cloud 项目导入到 IDEA5. 安装启动Mysql6. 安装启动Redis7. 创建数据库&#xff0c;执行 SQL脚本文件二、安装与配置 nacos2.1. 下载nacos2.2. 安装 nacos2.3. nacos持久化配置2.4. 执行脚本文件2.5. nacos连…

SpringBoot集成Elasticsearch实现博客高亮搜索

文章目录效果展示二、使用步骤1.引入maven依赖2. 编写spplication.properties3.配置客户端4.高亮搜索5.转换成实体对象总结效果展示 虽然看起来巴适&#xff0c;但是挺简单的&#xff01; &#x1f4dd; 英文检索 &#x1f4dd; 中文单字检索 二、使用步骤 1.引入maven依赖…

淘系技术,实力为2019年双11而战!稳!

2019 天猫双 11 全球狂欢节96秒成交额破百亿&#xff0c;24小时总成交额2684亿&#xff0c;创造了交易创建峰值 54.4万笔&#xff0f;秒的历史记录。天猫双11&#xff0c;已经不仅是购物节&#xff0c;也是品牌成长节、消费者互动节。天猫双11更是是商业的奥林匹克。 今年&…

上班从不迟到,生病不敢请假,加班唯命是从,明明已经很拼命了,为什么还是缺钱?...

为了省几百块钱房租&#xff0c;每天在路上多花两三个小时&#xff1b;为了少花几毛钱&#xff0c;买包纸巾也要货比三家&#xff1b;被上司大声指责&#xff0c;为了保住饭碗&#xff0c;只能陪着笑脸......上班从不迟到&#xff0c;生病不敢请假&#xff0c;加班唯命是从&…