Spark算子---实战应用
Spark算子实战应用
数据集 :http://grouplens.org/datasets/movielens/ MovieLens 1M Datase
相关数据文件 :
users.dat ---UserID::Gender::Age::Occupation::Zip-code
movies.dat --- MovieID::Title::Genres
ratings.dat ---UserID::MovieID::Rating::Timestamp
SogouQ.mini
完成以下业务需求:
1. 年龄段在“18-24”的男性年轻人,最喜欢看哪10部
2.得分最高的10部电影;看过电影最多的前10个人;女性看多最多的10部电影;男性看过最多 的10部电影
3.利用数据集SogouQ2012.mini.tar.gz 将数据按照访问次数进行排序,求访问量前10的网站
scala实现代码如下:
package hw3
import org.apache.spark._ import scala.collection.immutable.HashSet
import org.apache.spark.rdd.RDD
/**
* @author BIGDATA
*/
object spark_hw3{
var sc:SparkContext=null
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setAppName("MovieDemo")
.setMaster("local")
sc=new SparkContext(conf)
//准备数据
val rating=sc.textFile("C:\\Users\\BIGDATA\\Desktop\\文件\\BigData\\Spark\\3.SparkCore_2\\data\\data\\ratings.dat")
.map(_.split("::")).map {x => (x(0),x(1),x(2))}
//年龄段在“18-24”的男性年轻人,最喜欢看哪10部
top10LookeMovie //得分最高的10部电影
val topKScoreMostMovie = rating.map{x =>
(x._2, (x._3.toInt, 1))
}.reduceByKey { (v1, v2) =>
(v1._1 + v2._1, v1._2 + v2._2)
}.map { x =>
(x._2._1.toDouble / x._2._2.toDouble, x._1)
}.sortByKey(false).
take(10).
foreach(println)
//女性看最多的10部电影
top10FaleLookMovie
//男性看最多的10部电影
top10MaleLookMovie
//看过电影最多的前10个人
val topKmostPerson = rating.map{ x =>
(x._1, 1)
}.reduceByKey(_ + _).
map(x =>(x._2, x._1)).
sortByKey(false).
take(10).
foreach(println) val brower = sc.textFile("C:\\Users\\BIGDATA\\Desktop\\文件\\BigData\\Spark\\3.SparkCore_2\\SogouQ2012.mini\\SogouQ.mini")
val brs=brower.map(_.split("\t")).map { x =>
x(5)
}.cache //访问量前10的网站
val topKBrower = brs.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_)
.sortBy(_._2, false)
.take(10)
.foreach(println) } /**
* @param sc SparkContext对象
* @return 返回用户信息
*/
def getUsers(sc:SparkContext):RDD[Array[String]]={
val scobj=sc
val users=scobj.textFile("C:\\Users\\BIGDATA\\Desktop\\文件\\BigData\\Spark\\3.SparkCore_2\\data\\data\\users.dat")
.map(_.split("::"))
users
} /**
* @param sc
* @return 返回电影信息
*/
def getMovies(sc:SparkContext):RDD[Array[String]]={
val scobj=sc
val movies=scobj.textFile("C:\\Users\\BIGDATA\\Desktop\\文件\\BigData\\Spark\\3.SparkCore_2\\data\\data\\movies.dat")
.map(_.split("::"))
movies
} /**
*
* @param sc
* @return 电影评分信息
*/
def getRatings(sc:SparkContext):RDD[Array[String]]={
val scobj=sc
val ratings=scobj.textFile("C:\\Users\\BIGDATA\\Desktop\\文件\\BigData\\Spark\\3.SparkCore_2\\data\\data\\ratings.dat")
.map(_.split("::"))
ratings
}
def top10LookeMovie: Unit ={
//获取年龄段在“18-24”的男性年轻人的userid
val users=getUsers(sc)
val userList=users.filter(x=>x(1).equals("M") && x(2).toInt>=18 && x(2).toInt<=24)
.map(x=>x(0)).collect()
//注意:HashSet()后面要带小括号
val userSet=HashSet() ++ userList
//创建广播变量
val broadcastUserSet=sc.broadcast(userSet)
//统计出18-24岁男性喜欢看的前10名电影的movieid和次数
val ratings=getRatings(sc)
val topNMovies=ratings.map(x=>(x(0),x(1))) //ratings中所有的(userid,movieid)
//从rating数据过滤出“18-24”的男性年轻人的观影信息
.filter(x=>broadcastUserSet.value.contains(x._1))
.map(x=>(x._2,1))
.reduceByKey(_+_) //(movieid,次数)
.sortBy(_._2,false)
.take(10) //(movieid,次数) val movies=getMovies(sc)
//获取所有电影的(movieid,title)
val movieTitle=movies.map(x=>(x(0),x(1))).collect().toMap
topNMovies.map(x=>(movieTitle.getOrElse(x._1,null),x._2))
.foreach(x=>println(x._1+" "+x._2))
} /**
* 女性看过最多的10部电影
*/
def top10FaleLookMovie: Unit ={
val users = getUsers(sc)
//获取所有女性的userid
val faleUserId = users.filter(x => x(1).equals("F"))
.map(x => x(0)).collect()
val faleUserSet = HashSet() ++ faleUserId
//创建广播变量,里面存储所有女性的userid
val broadcastFaleSet = sc.broadcast(faleUserSet) val ratings = getRatings(sc)
//统计出女性看过最多的10部电影的(movieid,观看次数)
val top10moiveid = ratings.map(x => (x(0), x(1))) //(userid,movieid)
//过滤出女性观影数据
.filter(x => broadcastFaleSet.value.contains(x._1))
.map(x => (x._2, 1)) //(movieid,1)
.reduceByKey(_ + _)
.sortBy(_._2, false)
.take(10)
val top10movieRDD=sc.parallelize(top10moiveid) //(movieid,次数) val movies=getMovies(sc)
val allmoviesRDD=movies.map(x=>(x(0),x(1))) //(movieid,title)
//对两个RDD进行join操作,取二者的共同匹配项
allmoviesRDD.join(top10movieRDD) //(movieid,(title,次数))
.map(x=>(x._1,x._2._1,x._2._2))
.foreach(x=>println(x._1+" "+x._2+" "+x._3))
} /**
* 男性看过最多的10部电影
*/
def top10MaleLookMovie: Unit ={
val users = getUsers(sc)
//获取所有男性的userid
val faleUserId = users.filter(x => x(1).equals("M"))
.map(x => x(0)).collect()
val faleUserSet = HashSet() ++ faleUserId
//创建广播变量,里面存储所有男性的userid
val broadcastFaleSet = sc.broadcast(faleUserSet) val ratings = getRatings(sc)
//统计出男性看过最多的10部电影的(movieid,观看次数)
val top10moiveid = ratings.map(x => (x(0), x(1))) //(userid,movieid)
//过滤出男性观影数据
.filter(x => broadcastFaleSet.value.contains(x._1))
.map(x => (x._2, 1)) //(movieid,1)
.reduceByKey(_ + _)
.sortBy(_._2, false)
.take(10)
val top10movieRDD=sc.parallelize(top10moiveid) //(movieid,次数) val movies=getMovies(sc)
val allmoviesRDD=movies.map(x=>(x(0),x(1))) //(movieid,title)
//对两个RDD进行join操作,取二者的共同匹配项
allmoviesRDD.join(top10movieRDD) //(movieid,(title,次数))
.map(x=>(x._1,x._2._1,x._2._2))
.foreach(x=>println(x._1+" "+x._2+" "+x._3))
} }
Spark算子---实战应用的更多相关文章
- Spark入门实战系列--1.Spark及其生态圈简介
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...
- Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...
- 倾情大奉送--Spark入门实战系列
这一两年Spark技术很火,自己也凑热闹,反复的试验.研究,有痛苦万分也有欣喜若狂,抽空把这些整理成文章共享给大家.这个系列基本上围绕了Spark生态圈进行介绍,从Spark的简介.编译.部署,再到编 ...
- Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...
- Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建
[注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...
- Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...
- Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...
- Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...
- Spark入门实战系列--4.Spark运行架构
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...
随机推荐
- sqlite 常用命令
1)创建数据库文件: >sqlite3 /home/test.db 回车 就生成了一个test.db在/home路径下. 这样同时也SQLite3加载了这个test.db 2)用.help可以看 ...
- nginx静态资源缓存与压缩
一.静态资源缓存 参考文章 (1)apache设置max-age或expires 这里需要修改.htaccess文件. <IfModule mod_headers.c> <Files ...
- debian linux 下设置开机自启动
懒得写了,一张图简单明了.其实很简单,一开始没有加上nohup有点问题.现在问题已解决.
- 怎么在eclipse中安装svn插件
Subclipse Subclipse is an Eclipse Team Provider plug-in providing support for Subversion within th ...
- ( ̄▽ ̄)" 关于河北ETC记账卡的默认密码
去营业厅问了下,是6个1(111111),一般人我不告诉他 ...( _ _)ノ| 好吧,在技术博客里发这种东西合适吗? 还有就是,如果需要打印单位抬头发票的话,需要携带委托书盖单位公章(委托书可以去 ...
- Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory Android
首先,要看一下自己的项目使用 “Gradle版本” 接着要看一下项目根目录的build.gradle文件中的“dependencies”的 classpath 'com.github.dcendent ...
- VS Code插件Vue2 代码补全工具
一.简介 此扩展将Vue 2代码片段和语法突出显示添加到Visual Studio代码中. 这个插件基于最新的Vue官方语法高亮文件添加了语法高亮,并且依据Vue 2的API添加了代码片段. 支持语言 ...
- lua -- encode and decode
json.encode 将表格数据编码为 JSON 字符串. 格式: jsonString = json.encode(表格对象) 用法示例: ,b=,c2=},d={,},}) echo(str) ...
- .NET MVC+ EF+通用存储过程实现增删改功能以及使用事物处理
引摘: 1.EF对事务进行了封装:无论何时执行任何涉及Create,Update或Delete的查询,都会默认创建事务.当DbContext类上的SaveChanges()方法被调用时,事务就会提交, ...
- 手动分析linux是否中毒的几个考虑点
linux服务器在不允许安装任何杀毒软件的时候,手动分析有没有中病毒可以从以下几个特征点来考虑. 特征一:查看系统里会产生多余的不明的用户cat /etc/passwd 特征二:查看开机是否启动一些不 ...