Scala 使用graphx构造的图形未正确广播

Scala 使用graphx构造的图形未正确广播,scala,apache-spark,spark-graphx,Scala,Apache Spark,Spark Graphx,我使用graphx创建了一个图,现在我需要从原始图中提取子图。用户图是一个RDD,它有一个子图索引到用户。问题是这些子图没有得到计算。当我尝试对这些子图进行操作时,会出现java.lang.NullPointerException异常 class VertexProperty(val id:Long) extends Serializable case class User(val userId:Long, var offset:Int, val userCode:String, val Nam

我使用graphx创建了一个图,现在我需要从原始图中提取子图。用户图是一个RDD,它有一个子图索引到用户。问题是这些子图没有得到计算。当我尝试对这些子图进行操作时,会出现java.lang.NullPointerException异常

class VertexProperty(val id:Long) extends Serializable
case class User(val userId:Long, var offset:Int, val userCode:String, val Name:String, val Surname:String, val organizational_unit:String, val UME:String, val person_type:String, val SOD_HIGH:String, val SOD_MEDIUM:String, val SOD_LOW:String, val Under_mitigated:String) extends VertexProperty(userId)
case class Account(val accountId:Long, var offset:Int, val userCode:String, val userId:String, val account_creation_date:String, var disabled:String, var forcechangepwd:String, var pwdlife:String, var numberloginerror:String, var lastchangepwd:String, var lastlogin:String, var lastwronglogin:String, var state:String, var expire:String, var last_cert_time:String, var creation_date:String, var creation_user:String,var challenge_counter:String, var challenge_failed_attempt:String) extends VertexProperty(accountId) //Check if userCode is actually the code in this example.
case class Application(var applicationId:Long, var offset:Int, var Name:String, var Description:String, var Target:String, var Owner:String, var Ownercode:String, var Creation_date:String, var Creation_user:String) extends VertexProperty(applicationId)
case class Entitlement(val entitlementId:Long, var offset:Int, val Name:String, var Code:String, var Description:String, var Type:String, var Application:String, var Administrative:String, var Parent_ID:String, var Owner_code:String, var Scope_type:String, var Business_name:String, var Business_policy:String, var SOD_high:String, var SOD_medium:String, var SOD_low:String) extends VertexProperty(entitlementId)

/*
Some code for computing vertexRDD and edges
*/    

val graph: Graph[VertexProperty,String] = Graph(vertexRDD, edges, new VertexProperty(-1))
val triplets = graph.triplets
val temp = triplets.map(t => t.attr)
val distinct_users = temp.distinct.filter(t => t != "NULL")

var bcast_graph = sc.broadcast(graph)
val users_graph = distinct_users.map(du => du -> bcast_graph.value.subgraph(epred = t => t.attr == du))

长话短说,您不能
广播
一个
图形
,因为它包含一个
RDD
(实际上是其中的两个)。您不能在
RDD
上的
map
函数中使用
Graph
,因为它由
RDD
组成

正如我所说,这是一个很长的故事,为什么你不能做到这两个-他们实际上是同一枚硬币的两面。这和你面临的问题是一样的

Spark基于主/从概念构建。它位于主机的内存空间中,其中定义了
rdd
以及与之相关的元操作。但是代码--
映射(…)
中的
..
在从机(称为执行器)上执行。当您以任何方式引用不同的
RDD
时,您的map代码不能在执行器内部运行,而且
broadcast
也不会有任何帮助,因为
RDD
引用只能存在于主控器中

你能做些什么呢?您有两个选择:

  • 使用
    Collect()
    收集您需要的数据,然后
    广播该数据,或者仅在
    地图中引用该数据
    collect()
    将所有数据拉入主机,但最重要的是,对于您的问题,这意味着您现在可以在不使用
    RDD
    引用的情况下引用数据,因此您可以将收集到的数据发送给您的执行者—可以使用
    广播
    ,也可以仅通过在
    地图(…)中引用它们(Spark将把数据的副本发送给您的执行者)。这些工作中的哪一项(或者两者中的哪一项)取决于您的数据大小、速度期望等
  • 使用
    RDD.join()
    RDD.cogroup()
    同时处理两个
    图形

  • 这两个问题都很复杂,因为您正在处理一个高阶结构——GraphX
    Graph
    。您必须处理单独的
    Graph.Vertexts
    Graph.Edge
    RDD
    单独执行
    collect()
    join()
    然后通过将适当的
    RDD
    拼接在一起重新构建最终的
    图形

    长话短说,您不能
    播放
    一个
    图形
    ,因为它包含一个
    RDD
    (实际上是其中的两个)。您不能在
    RDD
    上的
    map
    函数中使用
    图形
    ,因为它由
    RDD
    组成

    就像我说的,这是一个很长的故事,为什么你不能做这两件事——它们实际上是同一枚硬币的两面。这是你面临的同一个问题

    Spark是建立在主/从概念上的。它在主内存空间中定义了
    RDD
    和与之相关的元操作。但是
    映射(…)
    中的
    ..
    代码会在从机(称为执行器)上执行。当您以任何方式引用不同的
    RDD
    时,您的map代码不能在执行器内部运行,
    broadcast
    也不会有任何帮助,因为
    RDD
    引用只能存在于主控器中

    你能做什么呢?你有两个选择:

  • 使用
    Collect()
    收集您需要的数据,然后
    广播该数据,或者仅在
    地图中引用该数据。
    Collect()
    将所有数据拉入主机,但最重要的是,对于您的问题,这意味着您现在可以在不使用
    RDD
    引用的情况下引用数据,因此您可以将收集到的数据发送给您的执行者—可以使用
    广播
    ,也可以仅通过在
    地图(…)中引用它们。
    代码(Spark将把数据的副本发送给您的执行者)。这些工作中的哪一项(或者两者中的哪一项)取决于您的数据大小、速度期望等
  • 使用
    RDD.join()
    RDD.cogroup()
    同时处理两个
    图形

  • 这两个问题都很复杂,因为您正在处理一个高阶结构——GraphX
    Graph
    。您必须处理单独的
    Graph.Vertexts
    Graph.Edge
    RDD
    单独执行
    collect()
    join()
    然后通过将相应的
    RDD拼接在一起重新构建最终的

    此外,我还尝试了这个方法,val user\u Graph=bcast\u Graph.value.subgraph(epred=t=>t.attr==“273”)/“273”是一个用户id。这为我提供了所需的输出。我不知道为什么在使用map函数时没有得到输出。我不知道您为什么要广播。
    图形
    ,因为它由
    RDD
    组成,根据其性质,它是并行的。您认为您使用
    sc.broadcast(图形)实现了什么
    ?我想在map函数中使用构造的graph。因此,在使用它之前,我需要广播它。我缺少什么吗?是的,你不能广播
    graph
    我尝试删除graph的广播并运行以下代码。val users\u graph=distinct\u users.map(du=>du->graph.subgraph(epred=t=>t.attr==du))。但它给了我错误。此外,我尝试了这个,val user\u graph=bcast\u graph.value.subgraph(epred=t=>t.attr==“273”)/“273”是一个用户id。这给了我所需的输出。我不知道为什么在使用map函数时没有得到输出。我不知道为什么要广播。
    图形
    ,因为它由
    RDD
    组成,是平行的