scala中Trait的参数

时间:2018-05-24 18:51:20

标签: scala apache-spark traits

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

newer_df = new_column(df, list, column_to_add, column_to_check)

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

如果它是一个案例类我们可以做,但在我的情况下它是一个对象

trait SparkSessionTrait(name:String) {

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

1 个答案:

答案 0 :(得分:3)

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

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()
}