2016-05-27 3 views
4

Я использую искровую оболочку для запуска моего кода. В моем коде я определил функцию, и я вызываю эту функцию с ее параметрами.«ошибка: тип несоответствия» в Spark с такими же найденными и необходимыми типами данных

Проблема в том, что я получаю следующую ошибку при вызове функции.

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] 

В чем причина этой ошибки? Имеет ли он какое-либо отношение к типу данных Graph в Spark?

Код: Это часть моего кода, которая включает определение и вызов функции «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)) 

Код работает без ошибок до последней строки, где он получает вышеупомянутую ошибку.

ответ

4

Вот трюк. Позволяет открыть 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) 

Все wh САР осталось назвать 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 state, вы должны отслеживать объекты, которые вы создаете, и если изменения типов определяют, убедитесь, что неоднозначные определения не сохраняются (переписывайте вещи, если необходимо), прежде чем продолжить.

+0

Непонятно из этого ответа, как оригинальный автор должен решить свою проблему. Кажется, это только показывает, как создать аналогичное сообщение об ошибке с использованием другого кода. – GeorgeLewis

+0

@GeorgeLewis Спасибо за отзыв. Thing ism - это ожидаемое поведение. Просто сообщение об ошибке не очень понятно. Помимо сохранения состояния REPL в чистом виде и удаления/переопределения двусмысленных определений здесь нечего делать. – zero323