Параметр к Черте в скале - PullRequest
0 голосов
/ 24 мая 2018

Мне нужна черта с, принимает параметр и использует его для создания неявного объекта.Следующим способом.

trait SparkSessionTrait(name:String) {

  implicit val sparkSession = SparkSession
                                .builder()
                                .appName("AcoE Workflow_${name}")
                                .master("yarn")
                                .enableHiveSupport()
                                .getOrCreate()
}

Как я могу передать args (0) в качестве параметра в SParkSessionTrait

Мы можем сделать, если это класс caseно в моем случае это объект

object Test extends SparkSessionTrait{




  def main(args: Array[String]): Unit = {
    val name = args(0)


    sparkSession.catalog.clearCache()
}

1 Ответ

0 голосов
/ 24 мая 2018

То, как вы хотите это сделать, просто не имеет смысла.

trait SparkSessionTrait(name:String)

не разрешено (но будет в Scala 3 с некоторыми ограничениями), оно должно быть class.

Но более важной проблемой является то, что если вы расширяете класс с параметрами (или признаком в Scala 3, это не имеет значения), эти параметры должны быть известны во время создания.Т.е. у тебя должно быть object Text extends SomeSessionTrait(someName).К тому времени, когда вызывается метод main, уже слишком поздно, оттуда нельзя установить name.

Один из способов изменить программу и заставить ее скомпилировать -

class SparkSessionTrait(name:String) {
  implicit val sparkSession = SparkSession
                                .builder()
                                .appName("AcoE Workflow_${name}")
                                .master("yarn")
                                .enableHiveSupport()
                                .getOrCreate()
}

object Test {
  def main(args: Array[String]): Unit = {
    val name = args(0)
    val sessionTrait = new SparkSessionTrait(name)
    import sessionTrait._

    sparkSession.catalog.clearCache()
}
...