Spark框架上DeltaSimRank算法的实现

该博客介绍了如何在Spark框架上实现DeltaSimRank算法,通过读取输入数据,进行图数据处理,利用Scala编程计算节点相似度,并通过迭代更新相似度得分,最终将结果保存到文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main.scala
import org.apache.spark._
import SparkContext._
object SparkDeltaSimRank {
  def main(args: Array[String]) {
    val iters = 10
    val conf = new SparkConf()
             .setMaster("local")
             .setAppName("PagRank")
             .set("spark.executor.memory", "1g")
             .setSparkHome("/home/wang/spark-0.9.0")           //(System.getenv("SPARK_HOME"))
             .setJars(Seq(System.getenv("SPARK_TEST_JAR")))
    val cs = new SparkContext(conf)
    val simrankline = cs.textFile("/home/wang/Desktop/experiment/input/5")
    val graphline = cs.textFile("/home/wang/Desktop/input/5")
    val indegreeline = cs.textFile("/home/wang/Desktop//input1/5")
    val graph = graphline.map{ s => 
      val key = s.split("\t")
      (key(0), key(1))
    }.distinct().groupByKey().cache()
   // graph.foreach(println _)
    val simrank = simrankline.map{ s =>
      val part = s.split("\t")
      (part(0),part(1).toDouble)
    }
    //simrank.foreach(println _)
    val indegree = indegreeline.map{ s =>
      val part = s.split("\t")
      (part(0), part(1).toDouble)
    }cache()
    //indegree.foreach(println _)
    
    
    def find_double(s: (String,Double)): (String,Double) = {
      val key = s._1.split("_")
      if(key(0).equals(key(1))){
        (s._1,1.0)
       } else s
    }
    
    
    def find_different(s: (String,Double)): (String,Double) = {
      val key = s._1.split("_")
      if(key(0).equals(key(1))){
        (s._1,0.0)
       } else s
    }
    
    val con = graph.join(simrank).values.flatMap{ case (urls, sim) =>
        urls.map(url => (url, sim))
      }
    
    var simrank_1 = con.reduceByKey(_+_).join(indegree).mapValues{sim => 
        if(sim._2 > 10e-10) sim._1 / sim._2 * 0.8
        else 0.0
      }
    
    simrank_1=simrank_1.map(s => find_double(s))
    var deltasimrank = simrank_1.join(simrank).mapValues(v => v._1 - v._2)
    deltasimrank.foreach(println _)
    
   for(i <- 1 to iters) {
      val con = graph.join(deltasimrank).values.flatMap{ case (urls, sim) =>
        if(sim > 10e-10) urls.map(url => (url, sim))
        else None
      }
      //con.foreach(println _)
      deltasimrank = con.reduceByKey(_+_).join(indegree).mapValues{sim => 
        if(sim._2 > 10e-10) sim._1 / sim._2 * 0.8
        else 0.0
      }
      deltasimrank=deltasimrank.map(s => find_different(s))
      deltasimrank.foreach(println _)
      simrank_1 = simrank_1.leftOuterJoin(deltasimrank).mapValues{ v =>
        if(v._2 != None)v._1 + v._2.get
        else v._1
      }
      //simrank.foreach(println _)
    }


    simrank_1.saveAsTextFile("/home/wang/Desktop/simrank")
  }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值