Graphx入门之简单pagerank

需求:有两份数据集,一份是边,一份是点。求点的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

你可能感兴趣的:(工具)