2017-08-04 224 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]