簡體   English   中英

Scala:在參數中提供類類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM