如何使用spark.broadcast [Map]创建一个方法作为参数?

时间:2016-04-29 09:39:15

标签: scala apache-spark

我知道这个问题一开始看起来很傻,但请查看代码。

我用这种方式制作了广播地图:

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

PairRDDFunctions.collectAsMap似乎返回scala.collection.Map,因此您的功能的签名应与此类型匹配,而不是更具体的scala.collection.immutable.Map,这是您的默认设置只需写下Map

def doSomething(clients: Broadcast[scala.collection.Map[String,Int]])