在 Spark 中具有相同找到和必需数据类型的"error: type mismatch"



我正在使用 Spark-shell 来运行我的代码。在我的代码中,我定义了一个函数,并使用其参数调用该函数。

问题是我在调用函数时收到以下错误。

error: type mismatch;
found   : org.apache.spark.graphx.Graph[VertexProperty(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC),String]
required: org.apache.spark.graphx.Graph[VertexProperty(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC),String]

此错误背后的原因是什么?它与Spark中的Graph数据类型有什么关系吗?

代码

:这是我代码的一部分,涉及函数"countpermissions"的定义和调用。

class VertexProperty(val id:Long) extends Serializable
case class User(val userId:Long, val userCode:String, val Name:String, val Surname:String) extends VertexProperty(userId)
case class Entitlement(val entitlementId:Long, val name:String) extends VertexProperty(entitlementId)
def countpermissions(es:String, sg:Graph[VertexProperty,String]):Long = {
    return 0
}
val triplets = graph.triplets
val temp = triplets.map(t => t.attr)
val distinct_edge_string = temp.distinct    
var bcast_graph = sc.broadcast(graph)        
val edge_string_subgraph = distinct_edge_string.map(es => es -> bcast_graph.value.subgraph(epred = t => t.attr == es))
val temp1 = edge_string_subgraph.map(t => t._1 -> countpermissions(t._1, t._2))

代码运行没有错误,直到最后一行,在那里它得到上面提到的错误。

这是诀窍。让我们打开 REPL 并定义一个类:

scala> case class Foo(i: Int)
defined class Foo

以及一个对此类进行操作的简单函数:

scala> def fooToInt(foo: Foo) = foo.i
fooToInt: (foo: Foo)Int

重新定义类:

scala> case class Foo(i: Int)
defined class Foo

并创建一个实例:

scala> val foo = Foo(1)
foo: Foo = Foo(1)

剩下的就是打电话给fooToInt

scala> fooToInt(foo)
<console>:34: error: type mismatch;
 found   : Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
 required: Foo(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC)
          fooToInt(foo)

是不是看起来很眼熟?另一个更好地了解正在发生的事情的技巧:

scala> case class Foo(i: Int)
defined class Foo
scala> val foo = Foo(1)
foo: Foo = Foo(1)
scala> case class Foo(i: Int)
defined class Foo
scala> def fooToInt(foo: Foo) = foo.i
<console>:31: error: reference to Foo is ambiguous;
it is imported twice in the same scope by
import INSTANCE.Foo
and import INSTANCE.Foo
         def fooToInt(foo: Foo) = foo.i

长话短说,这是一个意料之中的行为,尽管有点令人困惑,它源于同一范围内存在的模糊定义。

除非要定期:reset REPL 状态,否则应跟踪创建的实体,如果类型定义发生更改,请确保在继续之前不会保留任何不明确的定义(如果需要,请覆盖内容)。

相关内容

最新更新