我知道这个问题一开始看起来很傻,但请查看代码。
我用这种方式制作了广播地图:
val rdd = sqlc
.read
.format("jdbc")
.options(Map("url" -> driver, "dbtable" -> clientsTable))
.load()
.select("client_name","client_age")
.map { data => (data.getString(0),data.getInt(1)) }
.collectAsMap()
val clients = sqlc.sparkContext.broadcast(rdd)
我创建了一个方法value
作为参数:
def doSomething(clients: Broadcast[Map[String,Int]]) clients.toString()
但是,当我在我的代码中调用此方法时,Scala IDE会抛出此错误:
type mismatch; found : org.apache.spark.broadcast.Broadcast[scala.collection.Map[String,Int]] required: org.apache.spark.broadcast.Broadcast[scala.collection.immutable.Map[String,Int]] Note: scala.collection.Map[String,Int] >: Map[String,Int], but class Broadcast is invariant in type T. You may wish to define T as -T instead. (SLS 4.5)
我在这里找不到什么问题,即使用愚蠢的scala.collection.immutable.Map
更改方法签名也行不通......编译器给了我同样的错误。
仅供参考:我使用的是scala 2.10和scala IDE 4.3.0
感谢您的帮助。
答案 0 :(得分:3)
PairRDDFunctions.collectAsMap
似乎返回scala.collection.Map
,因此您的功能的签名应与此类型匹配,而不是更具体的scala.collection.immutable.Map
,这是您的默认设置只需写下Map
:
def doSomething(clients: Broadcast[scala.collection.Map[String,Int]])