2017-08-04 103 views
1
def loadFromMapR[T: Manifest](path: String): RDD[T] = { 
    val selectedTable = sc.loadFromMapRDB[T](path) 
    selectedTable } 

我在斯卡拉的工作,并希望允许从一个SparkContext加载的泛型类型。如果我指定类型,此代码将起作用。SparkContext.loadFromMapRDB与泛型类型

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] 

谢谢!

回答

0

添加: RDDTYPET定义:

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

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

这当然是简写为[注Manifest已过时,所以我ClassTag代之以]

这意味着 - 我们的功能需要隐含参数类型ClassTag[T]RDDTYPE[T],主叫loadFromMapRDB其预计这样的隐式参数当两者都必要的 - 如在它的签名可以看出:

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