具有泛型类型的SparkContext.loadFromMapRDB

时间:2017-08-04 17:58:27

标签: scala generics

def loadFromMapR[T: Manifest](path: String): RDD[T] = {
   val selectedTable = sc.loadFromMapRDB[T](path)
    selectedTable }

我在Scala工作,并希望允许从SparkContext加载泛型类型。如果我指定类型,此代码将起作用。

def loadFromMapR(path: String): RDD[basicObject] = {
  val selectedTable = sc.loadFromMapRDB[basicObject](path)
  selectedTable }

但我想让它变得通用!我的第一个代码没有编译!我收到一条错误消息:

not enough arguments for method loadFromMapRDB (implicit evidence $1: Scala.reflect.ClassTag[T])
could not find implicit value for parameter f: com.mapr.db.spark.RDD.RDDTYPE[T]

谢谢!

1 个答案:

答案 0 :(得分:0)

: RDDTYPE添加到T

的定义中
def loadFromMapR[T: ClassTag : RDDTYPE](path: String): RDD[T] = {
  sc.loadFromMapRDB[T](path)
}

[注意:Manifest已弃用,因此我将其替换为ClassTag]

这当然是简写:

def loadFromMapR[T](path: String)(implicit ev1: ClassTag[T], ev2: RDDTYPE[T]): RDD[T] = {
  sc.loadFromMapRDB[T](path)
}

这意味着 - 我们的函数需要类型为ClassTag[T]RDDTYPE[T]的隐式参数,在调用期望此类隐式参数的loadFromMapRDB时都是必需的 - 如其签名中所示:< / p>

def loadFromMapRDB[T](tableName: String)(implicit 
  evidence$1: scala.reflect.ClassTag[T], 
  e: DefaultType[T, OJAIDocument], 
  f: RDDTYPE[T]
): MapRDBTableScanRDD[T]