需求:有两份数据集,一份是边,一份是点。求点的PageRank
格式:
边:sourceID destID
点:name sourceID
spark-shell
spark shell属于最简单入门的local版本。建图有很多的方式,如将边的集合转换为图,或者是直接将数据导出为图。我们使用最简单的导出为图
- 代码如下
import org.apache.spark.graphx._
#用绝对路径来进行取数据,或者是HDFS的路径
val graph = GraphLoader.edgeListFile(sc,'file:///xx/yy/aa/dd/a.txt')
#查看数据是否导入成功
graph.vertices.take(10)
val pr = graph.pageRank(0.0001).vertices
pr.take(10)
- 坑
最开始自己定义的sc,结果就出错了。
//val sparkConf = new SparkConf().setAppName("GraphFromFile")
//val sc = new SparkContext(sparkConf)
spart-submit到集群
直接将spark-shell中的命令放到scala文件中是不可行的,需要做这几方面的工作
语法
- 定义package,在第一行里面
- import需要的包
- 定义Object.scala里面的语法规定
Scala必须编译成JAR文件才能提交
- sbt工具进行编译链接。
代码贴一下
package com.baidu.dcs.spark.graphx.graph
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.graphx.GraphLoader
import scala.util.MurmurHash
import org.apache.spark.graphx.Graph
import org.apache.spark.rdd.RDD
import org.apache.spark.graphx.VertexId
object GraphX{
def main(args: Array[String]): Unit = {
SparkConf().setAppName("GraphFromFile").setMaster("yarn-cluster")
val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf)
val graph = GraphLoader.edgeListFile(sc ,"hdfs://06.graph",true)
val domains = sc.textFile("hdfs:/06.dict").map {line => val
f = line.split("\t")
(f(1).toLong, f(0))
}
val pr = graph.pageRank(0.0001).vertices
val domain_pr = domains.join(pr).map{ case (id, (domain_name, rank)) => (domain_name, rank) }
println(domain_pr.collect().mkString("\n"))
}
结果
a,9.497575456491505
b,8.469759790256541
c,6.940365594306384
d,6.488258790438499
e,6.385893206335569
f,5.283553101069759
g,5.097438488331897