Scala编译graphX PageRank算法的简单实例

注意:

使用GraphLoader函数时对于Scala、Spark版本有兼容问题。
Scala编译graphX PageRank算法的简单实例_第1张图片
由于之前scalaVersion用的别的版本,所以一直出现版本不兼容的问题,导致代码无法生成jar包

Error:scalac: bad symbolic reference to org.apache.spark.Logging encountered in class file’GraphLoader.class’.
Cannot access type Logging in package org.apache.spark. The current classpath may be
missing a definition for org.apache.spark.Logging, or GraphLoader.class may have been compiled against a version that’s
incompatible with the one found on the current classpath.

1、源码解析

Scala编译graphX PageRank算法的简单实例_第2张图片
// 从特定的边列表文件中读取数据生成图框架

--val graph = GraphLoader.edgeListFile(sc, "hdfs://IP地址:9000/wy/Edge/followers.txt")--

// 用上面的图框架来调用pageRank(动态)算法
//特别注意:静态调用的方法名是staticPageRank(Int)
// vertices将返回顶点属性

val ranks = graph.pageRank(0.1).vertices

 //将上面得到的ranks(顶点属性)和用户进行关系连接
 //首先也是读取一个包含了用户信息的文件,然后调用了一个map函数,即将文件里的每行数据按 ”,” 切开并返回存储了处理后数据的RDD
 
val users = sc.textFile("hdfs://IP地址:9000/wy/Vertice/users.txt").map { line =>
  val fields = line.split(",")
  (fields(0).toLong, fields(1))
}

// 这里具体实现了将ranks和用户列表一一对应起来
// 从map函数的内容可以看出是按id来进行连接,但返回的结果只含用户名和它的相应rank值

val ranksByUsername = users.join(ranks).map {
  case (id, (username, rank)) => (username, rank)
}

// 收集上面RDD里的数据并打印出来

println(ranksByUsername.collect().mkString("\n"))

//将数据存入hdfs文件中,路径自定义

ranksByUsername.saveAsTextFile("hdfs://IP地址:9000/wy/test_PR01")

}

2、输入数据

在hdfs下 /wy/Edge里有followers.txt文件

Scala编译graphX PageRank算法的简单实例_第3张图片
在hdfs下 /wy/Vertice里有users.txt文件

Scala编译graphX PageRank算法的简单实例_第4张图片
这两份数据的量非常小,但是作为测试可以更好的分析其算法原理。

3、输出结果

3.1、动态调用

在这里插入图片描述
结果1:
Scala编译graphX PageRank算法的简单实例_第5张图片
下面变更下参数(tol值)

在这里插入图片描述
结果2:
Scala编译graphX PageRank算法的简单实例_第6张图片
可以看出两者之间的结果相差比较大,事实上,参数值越小得到的权值结果就越有说服力。

3.2、静态调用

在这里插入图片描述
结果1:
Scala编译graphX PageRank算法的简单实例_第7张图片
增加迭代次数:
在这里插入图片描述
结果2:
Scala编译graphX PageRank算法的简单实例_第8张图片
结果依然不够准确,再次增加迭代次数:
在这里插入图片描述
结果3:
Scala编译graphX PageRank算法的简单实例_第9张图片
可以看出对于该数据,用静态算法很难得到准确的结果

你可能感兴趣的:(Scala)