[英]Scala: provide class type in parameter
我有一種將類作為參數的方法,如下所示。
val hBaseRDD = spark.sparkContext.newAPIHadoopFile(path,
classOf[org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat[ImmutableBytesWritable, Result]],
classOf[ImmutableBytesWritable],
classOf[Result], conf)
我想編寫一個將參數作為類類型的方法,然后我可以在其中調用這一行。 像下面。
case class SequenceInput(conf: Configuration,
path: String,
storageClass: String,
keyClass: String,
valueClass: String,
){
override def read(sparkSession: SparkSession): DataFrame = {
val rdd = sparkSession.sparkContext.newAPIHadoopFile(path,
classOf[storageClass],
classOf[keyClass],
classOf[valueClass], conf)
rdd
}
但這要求我創建 storaClass、keyClass、valueClass 但這些是保存類類型的變量。
這該怎么做?
您正在編寫構造函數,而不是方法,而是更改
storageClass: String,
keyClass: String,
valueClass: String
成為類對象,而不是字符串
那么你的函數可以
return sparkSession.sparkContext.newAPIHadoopFile(path,
storageClass,
keyClass
valueClass, conf)
然后
val storageClass = Class.forName(config.get("storage_class"))
...
// remove path from the constructor since you should be able to use multiple paths
val df = SequenceInput(storageClass,...).read(spark, path)
請記住, Class.forName
需要完全限定名稱,而不僅僅是"ImmutableBytesWritable"
,例如
如果我理解正確,您需要將String
轉換為Class
。 你可以用Class.forName(String)
做到這一點
case class SequenceInput(conf: Configuration,
path: String,
storageClass: String,
keyClass: String,
valueClass: String,
) {
override def read(sparkSession: SparkSession): DataFrame = {
val rdd = sparkSession.sparkContext.newAPIHadoopFile(path,
Class.forName(storageClass),
Class.forName(keyClass),
Class.forName(valueClass), conf)
rdd
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.