Ans*_*ary 6 scala apache-spark spark-graphx
我正在使用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]
Run Code Online (Sandbox Code Playgroud)
此错误的原因是什么?它与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))
Run Code Online (Sandbox Code Playgroud)
该代码将无错误运行,直到出现上述错误的最后一行。
这是窍门。让我们打开REPL并定义一个类:
scala> case class Foo(i: Int)
defined class Foo
Run Code Online (Sandbox Code Playgroud)
以及一个在此类上运行的简单函数:
scala> def fooToInt(foo: Foo) = foo.i
fooToInt: (foo: Foo)Int
Run Code Online (Sandbox Code Playgroud)
重新定义类:
scala> case class Foo(i: Int)
defined class Foo
Run Code Online (Sandbox Code Playgroud)
并创建一个实例:
scala> val foo = Foo(1)
foo: Foo = Foo(1)
Run Code Online (Sandbox Code Playgroud)
剩下的就是打电话了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)
Run Code Online (Sandbox Code Playgroud)
看起来熟悉吗?更好地了解发生了什么的另一个技巧:
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
Run Code Online (Sandbox Code Playgroud)
长话短说,这是一个预期的行为,尽管有些混乱,但它是由相同范围内存在的不明确定义引起的。
除非您想定期进行:resetREPL状态,否则您应该跟踪所创建的实体,并且如果类型定义发生更改,请确保在继续操作之前不会存在任何歧义定义(如有必要,请覆盖内容)。
| 归档时间: |
|
| 查看次数: |
2496 次 |
| 最近记录: |