美文网首页
Graphx中处理字符串类型的ID

Graphx中处理字符串类型的ID

作者: 八刀一闪 | 来源:发表于2017-05-15 21:35 被阅读293次

  Graphx中的结点ID只能是Long型的,但是在实际的业务中有时会遇到字符串类型的ID,这时需要建立一个结点ID的映射。

使用python随机生成100条字符串类型的边

from random import randint

vertices = ['v_'+str(i) for i in range(1000)]

edges = []
while len(edges) != 100:
    i = randint(0, 1000)
    j = randint(0, 1000)
    if i == j:
        continue
    else:
        edges.append((vertices[i], vertices[j]))

for i, j in edges:
    print '%s %s' % (i, j)

对这个网络求联通图

import spark.sqlContext.implicits._
import org.apache.spark.sql._
import org.apache.spark.graphx.{Graph, VertexId, Edge}

// 加载数据,数据格式为每行:vi vj
val data = spark.sparkContext.textFile("/data/graph_sample").map{line =>
  val items = line.split(" ")
  (items(0), items(1))
}.toDF("vi", "vj")

// 建立映射
val dict = data.select("vi").union(data.select("vj")).distinct.rdd
  .zipWithIndex().map {
  case (Row(id: String), index) =>
    (id, index)
}.toDF("id", "vid")

val dictVi = dict.withColumnRenamed("id", "vi").withColumnRenamed("vid", "vid_i")

val dictVj = dict.withColumnRenamed("id", "vj").withColumnRenamed("vid", "vid_j")

val data2 = data.join(dictVi, Seq("vi")).join(dictVj, Seq("vj"))

// 构造网络
val vertices = data2.select("vid_i")
  .union(data2.select("vid_j"))
  .distinct
  .map{case Row(id: VertexId)=>(id, "")}

val edges = data2.select("vid_i", "vid_j")
  .flatMap{
    case Row(vidi: Long, vidj: Long) =>
      Array(Edge(vidi, vidj, ""), Edge(vidj, vidi, ""))
  }

val g = Graph(vertices.rdd, edges.rdd, "")

// 求联通子图
val cc = g.connectedComponents()

// 结点ID映射回原来的ID
val ret = cc.vertices.toDF("vid", "cid").join(dict, Seq("vid"))

遇到的坑
  在线上实际使用的时候,遇到过这样的一个问题:对于一个结点,开始时是一个ID,但是在执行过程中它的ID变了。猜测产生这个问题的原因是Catalyst优化错误导致的,最后采用了一种强行中断sql优化的方式:将映射好的ID存入hive中,然后再从hive读取进来。相关问题可以参考:GraphFrames的一个issue

相关文章

  • Graphx中处理字符串类型的ID

      Graphx中的结点ID只能是Long型的,但是在实际的业务中有时会遇到字符串类型的ID,这时需要建立一个结点...

  • JNI 字符串处理

    JNI 字符串处理处理字符串从第三章中可以看出 JNI 中的基本类型和 Java 中的基本类型都是一一对应的,接下...

  • 建表语句

    product_id CHAR类型是指定最大长度的字符串类型。 字符串长度超出4的部分是无法输入到该列中的。比如输...

  • GraphX 学习笔记

    “像顶点一样思考” ​ Spark GraphX是一个分布式图处理框架,Spark GraphX基于Spark平...

  • ARC下所有权修饰符

    oc编程中为了处理对象,可将变量类型定义为id类型或各种对象类型。 所谓对象类型就是指向NSObject这样的oc...

  • Spark GraphX

    Spark GraphX GraphX简介 主要特点 演化过程 应用场景 分布式图计算处理技术介绍 下面分别从图数...

  • Java--String、StringBuilder、Strin

    在 Java 中,字符串被作为 String 类型的对象处理。String 类位于 java.lang 包中。默认...

  • 字符串

    String类 在java中,字符串被作为String类型的对象处理,即String是字符串常量的类。 创建Str...

  • 2020-08-03 mysql中隐式转换不会走索引???

    mysql中varchar类型的id,where id=1,会用到索引吗?int 类型的id,where id="...

  • OC中的id类型

    OC中的id类型 id类型 静态类型和动态类型 为什么要有动态类型? id数据类型与静态类型 1. 静态类型和动态...

网友评论

      本文标题:Graphx中处理字符串类型的ID

      本文链接:https://www.haomeiwen.com/subject/ngfkxxtx.html