我有一種將類作為引數的方法,如下所示。
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 但這些是保存型別別的變數。
這該怎么做?
uj5u.com熱心網友回復:
您正在撰寫建構式,而不是方法,而是更改
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",例如
uj5u.com熱心網友回復:
如果我理解正確,您需要將 a 轉換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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/332703.html
上一篇:串列串列中的重復項
