Scala 如何从数据帧构建图形?(图hx)

Scala 如何从数据帧构建图形?(图hx),scala,apache-spark,dataframe,graph,spark-graphx,Scala,Apache Spark,Dataframe,Graph,Spark Graphx,我是scala和spark的新手,需要从数据帧构建一个图形。这是我的数据帧的结构,其中S和O是节点,P列表示边 +---------------------------+---------------------+----------------------------+ |S |P |O | +---------------------------+---

我是scala和spark的新手,需要从数据帧构建一个图形。这是我的数据帧的结构,其中S和O是节点,P列表示边

+---------------------------+---------------------+----------------------------+
|S                          |P                    |O                           |
+---------------------------+---------------------+----------------------------+
|http://website/Jimmy_Carter|http://web/name      |James Earl Carter           |
|http://website/Jimmy_Car   |http://web/country   |http://website/United_States|
|http://website/Jimmy_Car   |http://web/birthPlace|http://web/Georgia_(US)     |
+---------------------------+---------------------+----------------------------+
这是数据帧的代码,我想从数据帧“dfA”创建一个图形

val测试=sc
.textFile(“testfile.ttl”)
.map(u.split(“”)
.map(p=>Triple(Try(p(0).toString()).toOption,
Try(p(1).toString()).toOption,
Try(p(2.toString()).toOption))
.toDF()
val url_regex=“”^(?::(?:\s\)?,\s.*)$”
val dfA=测试
.withColumn(“Subject”,regexp\u extract($“Subject”,url\u regex,1))
.withColumn(“谓词”,regexp\u extract($“谓词”,url\u regex,1))
.withColumn(“Object”,regexp\u extract($“Object”,url\u regex,1))

要创建
GraphX
图形,您需要从数据帧中提取顶点并将它们与ID关联。然后,您需要使用这些ID提取边(顶点的两个元组+元数据)。所有这些都需要在RDD中,而不是数据帧中

换句话说,顶点需要一个
RDD[(VertexId,X)]
,而
RDD[边(VertexId,VertexId,Y)]
其中
X
是顶点元数据,
Y
是边元数据。请注意,
VertexId
只是
Long
的别名

在您的例子中,使用“S”和“O”作为顶点列,“p”作为边列,它将如下所示

//让我们创建顶点RDD。
val顶点:RDD[(顶点ID,字符串)]=df
.select(分解(数组('S,'O))//S和O是顶点
.distinct//我们删除重复项
.rdd.map(u.getAs[String](0))//转换为rdd
.zipWithIndex//将长索引与每个顶点关联
.map(u.swap)
//现在让我们定义一个顶点数据帧,因为在sparkSQL中连接更清晰
val vertexDf=顶点.toDF(“id”,“节点”)
//让我们提取边并用它们各自的ID连接它们的顶点
val边缘:RDD[边缘(顶点、顶点、字符串)]=df
.join(vertexDf,df(“S”)==vertexDf(“node”)//获取“S”的ID
.选择('P,'O,'id as'id)
.join(vertexDf,df(“O”)==vertexDf(“node”)//获取“O”的ID
.rdd.map(行=>//使用列“P”作为元数据创建边缘
边(row.getAs[Long](“id”)、row.getAs[Long](“id”)、row.getAs[String](“P”))
//最后
val图形=图形(顶点、边)

您有机会看一下答案吗?它解决了您的问题吗?您好,是的,答案解决了问题。但是我将“val-edges:RDD[Edge(VertexId,VertexId,String)]”更改为“val-edges:RDD[Edge[String]”。非常感谢!很抱歉,回复太晚了,我遇到了问题,无法验证代码。我今天就这么做了。
 val test = sc
     .textFile("testfile.ttl")
     .map(_.split(" "))
     .map(p => Triple(Try(p(0).toString()).toOption,
                      Try(p(1).toString()).toOption,
                      Try(p(2).toString()).toOption))
     .toDF()

  val url_regex = """^(?:"|<{1}\s?)(.*)(?:>(?:\s\.)?|,\s.*)$"""
  val dfA = test
      .withColumn("Subject", regexp_extract($"Subject", url_regex, 1))
      .withColumn("Predicate", regexp_extract($"Predicate", url_regex, 1))
      .withColumn("Object", regexp_extract($"Object", url_regex, 1))