将二分图转换为邻接矩阵spark scala

时间:2016-03-14 11:32:01

标签: scala apache-spark

我正在尝试转换格式为

的边列表
      developer     tester    architect
 a        1            0          0
 b        1            1          0
 c        1            0          1

其中邻接矩阵将采用

的形式
 1    0    0
 1    1    0
 1    0    1

我想以下列格式存储矩阵

def pageHash(title:String )  = title.toLowerCase.replace(" ","").hashCode.toLong


val edges: RDD[Edge[String]] = sc.textFile("/user/query.csv").map { line => 
  val row = line.split(",") 
  Edge(pageHash(row(0)), pageHash(row(1)), "1") 
} 
val graph: Graph[Int, String] = Graph.fromEdges(edges, defaultValue = 1)

我使用GraphX

尝试过
{{1}}

我能够创建图形但不能转换为相邻的矩阵表示。

1 个答案:

答案 0 :(得分:2)

一种可行的方法是:

  1. RDD转换为DataFrame

    val rdd = sc.parallelize(Seq(
      ("a", "developer"), ("b", "tester"), ("b", "developer"),
      ("c","developer"), ("c", "architect")))
    
    val df = rdd.toDF("row", "col")
    
  2. 索引列:

    import org.apache.spark.ml.feature.StringIndexer
    
    val indexers = Seq("row", "col").map(x =>
      new StringIndexer().setInputCol(x).setOutputCol(s"${x}_idx").fit(df)
    )
    
  3. 转换数据并创建RDD[MatrixEntry]

    import org.apache.spark.functions.lit
    import org.apache.spark.mllib.linalg.distributed.{MatrixEntry, CoordinateMatrix}
    
    
    val entries = indexers.foldLeft(df)((df, idx) => idx.transform(df))
      .select($"row_idx", $"col_idx", lit(1.0))
      .as[MatrixEntry]  // Spark 1.6. For < 1.5 map manually
      .rdd
    
  4. 创建矩阵

    new CoordinateMatrix(entries)
    
  5. 此矩阵可以进一步转换为任何其他类型的分布式矩阵,包括RowMatrixIndexedRowMatrix