scala – Spark中的“错误:类型不匹配”具有相同的已找到和必需
发布时间:2020-12-16 09:26:38 所属栏目:安全 来源:网络整理
导读:我正在使用spark-shell来运行我的代码.在我的代码中,我定义了一个函数,然后用它的参数调用该函数. 问题是我在调用函数时遇到以下错误. error: type mismatch;found : org.apache.spark.graphx.Graph[VertexProperty(in class $iwC)(in class $iwC)(in class
我正在使用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 长话短说,这是一种预期的,虽然有点令人困惑的行为,这种行为源于同一范围内存在的含糊不清的定义. 除非您想要定期:重置REPL状态,否则您应该跟踪您创建的实体,如果类型定义发生更改,请确保在继续操作之前不会出现含糊不清的定义(如果需要,则覆盖内容). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |