Spark实现 集体智慧编程 第二章电影推荐

集体智慧编程中的电影推荐算法主要分两步:

1. 通过影评者对看多的相同电影的评分,计算影评者两两之间的兴趣相似度

2. 根据影评者之间的相似度和对电影的评分,为其他影评者没看过的电影提供推荐指数,推荐指数为 相似度×电影评分

具体细节还是从代码中体会比较好:

package PCI2

import org.apache.spark.sql.SparkSession

object Recomment {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("recomment").master("local[2]").getOrCreate()
    import spark.implicits._
    val movies = spark.read.textFile("file:///home/xdk/file/movie.txt")
    val keyPeople = movies.map(x=>{val sz = x.split("\t"); Tuple2(sz(0), Tuple2(sz(1), sz(2)))}).rdd
    val keyMovie = keyPeople.map(x=>(x._2._1, (x._1, x._2._2)))
    val joined = keyMovie.join(keyMovie)
    val filtered = joined.filter(x=>x._2._1._1 != x._2._2._1)
    val peoplePair = filtered.map(x=>{if(x._2._1._1 < x._2._2._1)
      ((x._2._1._1, x._2._2._1), (x._1, x._2._1._2, x._2._2._2))
      else
      ((x._2._2._1, x._2._1._1), (x._1, x._2._2._2, x._2._1._2))
    })
    //影评者两两之间的相似度
    val sim = peoplePair.distinct().groupByKey().map(x=>(x._1, pearson(x._2)))

//    simulator.foreach(println)

    val simulator = sim.filter(x=>x._2>0).persist()
    val common = filtered.map(x=>((x._2._1._1, x._2._2._1), (x._1, x._2._2._2)))
//    common.foreach(println)
    val cart = keyPeople.cartesian(keyPeople).filter(x=>x._1._1 != x._2._1)
    val hisMovie = cart.map(x=>((x._1._1, x._2._1), x._2._2)).distinct()
    val recomm = hisMovie.subtract(common)
    val simulator1 = simulator.flatMap(x=>Array(x, ((x._1._2, x._1._1), x._2)))
    val joinRes = recomm.join(simulator1)
    val recommScore = joinRes.map(x=>((x._1._1, x._2._1._1), (x._2._1._2.toDouble * x._2._2.toDouble, x._2._2.toDouble)))
    val recommScoreSum = recommScore.reduceByKey((a, b) => (a._1+b._1, a._2+b._2))
    val recommMovies = recommScoreSum.map(x=>(x._1._1, (x._1._2, x._2._1/x._2._2))).groupByKey()

    println("======================")
    recommMovies.foreach(println)


  }


  def pearson(arg:Iterable[(String, String, String)]): Double ={
    var sumxy = 0.0
    var sumx = 0.0
    var sumy = 0.0
    var sumpowerx = 0.0
    var sumpowery = 0.0

    for(a<-arg){
      val x = a._2.toDouble
      val y = a._3.toDouble
      sumxy += x*y
      sumx += x
      sumy += y
      sumpowerx += x*x
      sumpowery += y*y
    }

    val n = arg.size
    val num = sumxy*n - sumx*sumy
    val den = math.sqrt(n*sumpowerx - sumx*sumx)*math.sqrt(n*sumpowery - sumy*sumy)

    if (den == 0)
      0
    else
      num/den
  }

}


测试数据:

Lisa Rose	The Night Listener	 3.0
Lisa Rose	You, Me and Dupree	 2.5
Lisa Rose	Lady in the Water	 2.5
Lisa Rose	Superman Returns	 3.5
Lisa Rose	Just My Luck	 3.0
Lisa Rose	Snakes on a Plane	 3.5
Michael Phillips	Lady in the Water	 2.5
Michael Phillips	Superman Returns	 3.5
Michael Phillips	The Night Listener	 4.0
Michael Phillips	Snakes on a Plane	 3.0
Mick LaSalle	The Night Listener	 3.0
Mick LaSalle	You, Me and Dupree	 2.0
Mick LaSalle	Lady in the Water	 3.0
Mick LaSalle	Superman Returns	 3.0
Mick LaSalle	Just My Luck	 2.0
Mick LaSalle	Snakes on a Plane	 4.0
Toby	Superman Returns	 4.0
Toby	You, Me and Dupree	 1.0
Toby	Snakes on a Plane	 4.5
Gene Seymour	The Night Listener	 3.0
Gene Seymour	You, Me and Dupree	 3.5
Gene Seymour	Lady in the Water	 3.0
Gene Seymour	Superman Returns	 5.0
Gene Seymour	Just My Luck	 1.5
Gene Seymour	Snakes on a Plane	 3.5
Jack Matthews	Lady in the Water	 3.0
Jack Matthews	Superman Returns	 5.0
Jack Matthews	The Night Listener	 3.0
Jack Matthews	You, Me and Dupree	 3.5
Jack Matthews	Snakes on a Plane	 4.0
Claudia Puig	Superman Returns	 4.0
Claudia Puig	Just My Luck	 3.0
Claudia Puig	The Night Listener	 4.5
Claudia Puig	You, Me and Dupree	 2.5
Claudia Puig	Snakes on a Plane	 3.5




<think>嗯,用户想找关于Hadoop大数据项目的实战经验或教程。首先,我需要回顾一下他们提供的引用内容,看看有没有相关的资源可以推荐。引用1提到了Hadoop综合案例,包括数据预处理、Hive分析和可视化,这可能是一个完整的项目流程。引用2是电商日志分析系统,看起来是一个具体的应用案例,涉及数据收集到可视化的闭环。引用3中的LOAD DATA语句可能来自数据导入到Hive或HDFS的步骤,属于数据处理的一部分。 用户需要的是实战案例和教程,所以应该整合这些引用中的案例,并给出学习路径。比如,先搭建Hadoop环境,然后数据采集、预处理、分析,最后可视化。这样分步骤的结构会更清晰。同时,可能需要提到每个阶段使用的工具和技术,比如HttpClient和Python用于数据采集,MapReduce和Hive用于处理分析,SSM和ECharts用于展示。 另外,用户可能对具体的项目类型感兴趣,比如招聘网站分析、电商日志系统,这些都是常见的应用场景。要确保推荐案例覆盖这些方面,并提供参考资料链接。可能还需要考虑用户的技术背景,是否需要从基础搭建开始,所以引用中的伪分布式环境搭建也很重要。 最后,生成相关问题时要围绕Hadoop项目的学习路径、优化方法、应用场景等,帮助用户深入探索。需要确认引用中的内容是否足够覆盖这些问题,比如引用2提到的电商项目是否符合应用场景的问题,引用1中的各个步骤是否涉及性能调优等。</think>以下是关于Hadoop大数据项目实战案例推荐内容及学习路径: ### 一、Hadoop综合实战项目推荐 1. **招聘网站数据分析案例** - 完整流程覆盖:从$Hadoop2.7.3$伪分布式环境搭建到数据可视化 - 技术栈包含: $$Python数据采集 \rightarrow MapReduce预处理 \rightarrow Hive分析 \rightarrow SpringBoot+ECharts可视化$$ 引用案例中展示了如何通过Hive实现岗位需求趋势分析[^1] 2. **电商日志分析系统** - 典型商业场景:基于真实电商日志数据闭环开发 - 核心模块: ```shell 用户行为日志采集 → Flume日志聚合 → HDFS存储 → Spark实时处理 → 可视化报表 ``` 该项目包含AB测试、用户路径分析等典型功能[^2] 3. **电影数据分析案例** - 基础实战示例:使用Hive进行数据清洗与统计 - 数据加载示例: ```sql LOAD DATA LOCAL INPATH '/path/data.csv' INTO TABLE movies; ``` 包含评分分析、评论情感分析等基础操作[^3] ### 二、学习路径建议 1. **环境搭建阶段** - 掌握伪分布式集群部署(参考引用环境搭建章节) - 练习HDFS基础操作:`hdfs dfs -put/get`等命令 2. **数据处理阶段** - MapReduce编程实现数据清洗(如日志字段提取) - 使用Hive进行$SQL$查询优化(分区表、分桶表应用) 3. **可视化阶段** - 集成$SpringBoot$与ECharts(引用案例第6章) - 开发数据看板:如实时交易量监控仪表盘 ### 三、性能优化要点 1. **MapReduce调优** - 合理设置`mapreduce.task.io.sort.mb`参数 - 使用Combiner减少网络传输量 2. **Hive优化** - 对常用查询字段建立分区: $$CREATE TABLE logs(ts BIGINT) PARTITIONED BY (dt STRING);$$ - 启用Tez执行引擎提升查询速度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值