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算子---实战应用的更多相关文章

  1. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  2. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  3. 倾情大奉送--Spark入门实战系列

    这一两年Spark技术很火,自己也凑热闹,反复的试验.研究,有痛苦万分也有欣喜若狂,抽空把这些整理成文章共享给大家.这个系列基本上围绕了Spark生态圈进行介绍,从Spark的简介.编译.部署,再到编 ...

  4. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  5. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  6. Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...

  7. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...

  8. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

  9. Spark入门实战系列--4.Spark运行架构

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...

随机推荐

  1. 启动和停止kafka 及kafka manager

    启动kafka: sh /app/pet_kafka_xxxx_cluster/bin/kafka-server-start.sh -daemon /app/pet_kafka_xxxx_cluste ...

  2. django官方文档--对静态文件的管理

    一.入门级理解: 在django中对静态文件的管理和模板(template)的思路是一样的.在模板的管理中django是把app用到 到的模板都保存到app目录下的templates子目录中. 静态文 ...

  3. JSON.toJSONString中序列化空字符串遇到的坑

    前言 最近在做系统Bug修复时遇到了一个问题,调用其他服务时传递的参数和自己预先的不一致,例如Map中有10条记录,然后使用JSON.toJSONString 包装后进行网络传递,但是通过调试发现接收 ...

  4. mysql打开binlog

    修改mysql的配置文件,ubuntu下mysql的配置文件存放位置为:/etc/mysql/my.cnf 找到log_bin配置项,指定一个路径: 重启数据库:/etc/init.d/mysql r ...

  5. iOS-登录认证/json解析

    用户输入用户名和密码,点击登录...我们把用户名和密码(用post方式或者get方式,get方式多用于测试看你需要)传给服务器,服务器进行判断,然后返回一个接口给我们(这里服务器返回的json接口,正 ...

  6. css3实现画对号动画

    目标:实现对号动画,慢慢画出来的感觉: 原理:外层div的背景是一个对号图片,用一个div做遮罩,让遮罩div层从左到右做运动一次即可实现动画,需要注意的是遮罩div的初始位置应该在外层div的外面: ...

  7. C++中的typedef typename 作用

    今天在代码里看到了这样一段代码: typedef typename RefBase::weakref_type weakref_type; 起初一直搞不懂为什么要加个typename,后来搜索了一下才 ...

  8. 关于CAE的那点儿破事儿

    CAE是计算机辅助工程的英文简写,所涵盖的范围甚是广泛.现在很多人提到CAE,总是联想到结构有限元计算,更有甚者认为有限元就是CAE.还有人把所有的工程数值计算都称作有限元.本文就这一话题,来谈谈关于 ...

  9. 深入云存储系统Swift核心组件:Ring实现原理剖析

    http://www.cnblogs.com/yuxc/archive/2012/06/22/2558312.html 简介 OpenStack是一个美国国家航空航天局和Rackspace合作研发的开 ...

  10. Lua语法基础(1)---简介、基本数据类型、表达式

    我觉得我已经陷入了一个坑内.因为,安装了Lua和SublimeText3编辑器之后,怎么使自己编写的lua代码在untiy内运行起来,是个我完全不了解的机制.先放一放吧.首先,来回顾一下Lua的语法基 ...