scala 中 Trait 的参数

Parameter to the Trait in scala

我需要一个带有参数并将其用于创建隐式对象的特征。通过以下方式。

trait SparkSessionTrait(name:String) {

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

如何将 args(0) 作为参数传递给 SParkSessionTrait

如果是这种情况我们可以做 class 但在我的情况下它是一个对象

object Test extends SparkSessionTrait{




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


    sparkSession.catalog.clearCache()
}

你想要的方式根本没有意义。

trait SparkSessionTrait(name:String)

是不允许的(但在 Scala 3 中会有一些限制),它必须是 class

但更重要的问题是,如果您使用参数(或 Scala 3 中的特征,这无关紧要)扩展 class,则需要在构造时知道这些参数。 IE。你必须有 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()
}