【实践】基于spark的CF实现及优化

本文档记录了使用Spark实现分布式协同过滤(CF)的过程,并进行了性能优化,实际运行效果良好。
摘要由CSDN通过智能技术生成
最近项目中用到ItemBased Collaborative Filtering,实践过spark mllib中的ALS,但是因为其中涉及到降维操作,大数据量的计算实在不能恭维。

所以自己实践实现基于spark的分布式cf,已经做了部分优化。目测运行效率还不错。以下代码

package model

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{DataFrame}
import org.apache.spark.sql.hive.HiveContext

/**
  * Created by dengxing on 2017/7/18.
  */
object CF {

  /** 基于dt时间获取原始数据源
    *
    * @param sc    SparkContext
    * @param table 转换的hive表
    * @param day   获取当前日期的数据
    * @return 原始数据的dataFrame
    */
  def getResource(sc: SparkContext, table: String, day: String) = {
    val hiveContext = new HiveContext(sc)
    import hiveContext.sql
    val resource = sql("select "
      + "uid,"
      + "aid,"
      + "cnt"
      + " from " + table + " where dt ='" + day + "'")
    resource
  }

  /**
    * 分布式计算余弦相似度
    * --------------------------------
    * user1     user2
    * item1  score11   score21 (X)
    * item2  score12   score22 (Y)
    * --------------------------------
    * sim(item1,item2) = XY / math.sqrt(XX) * math.sqrt(YY)
    * XY= score11 * score12 + score21 * score22
    * XX = score11 * score11 + score21 * score21
    * YY = score12 * score12 + score22 * score22
    *
    * @param resource
    * @return RDD[(item1,item2,sim)]
    */
  def getCosineSimilarity(resource: DataFrame): RDD[(String, (String, Double))] = {
    val rating = resource.map {
      row => {
        val uid = row.getString(0)
        val aid = row.getString(1)
        val score = row.getString(2).toDouble
        (uid, aid, s
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值