“Error: type mismatch” no Spark com os mesmos tipos de dados encontrados e requeridos

Eu estou usando spark-shell para executar o meu código. No meu código, defini uma function e chamo essa function com seus parâmetros.

O problema é que eu recebo o erro abaixo quando eu chamo a function.

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] 

Qual é a razão por trás desse erro? Tem alguma coisa a ver com o tipo de dados Graph no Spark?

Código: Esta é a parte do meu código que envolve a definição e chamada da function “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)) 

O código é executado sem erros até a última linha, onde recebe o erro mencionado acima.

Aqui está o truque. Vamos abrir o REPL e definir uma class:

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

e uma function simples que opera nesta class:

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

redefinir a class:

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

e crie uma instância:

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

Tudo o que resta é chamar fooToInt :

 scala> fooToInt(foo) :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) 

Parece familiar? Ainda outro truque para se ter uma ideia melhor do que está acontecendo:

 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 :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 

Portanto, para encurtar a história, este é um comportamento esperado, embora um pouco confuso, que surge de definições ambíguas existentes no mesmo escopo.

A menos que você queira periodicamente :reset estado do REPL, deve controlar as entidades criadas e, se as definições dos tipos forem alteradas, certifique-se de que nenhuma definição ambígua persista (sobrescreva as coisas, se necessário) antes de continuar.