首页 > 解决方案 > 有没有办法在Scala中实现一个带有泛型类型的可选参数的函数?

问题描述

我试图通过“重写”我的一些 PySpark 代码来学习一些 Scala。我有一个数据源列表,它们都有一个需要应用的转换列表。其中一些是常见的,有些则不是,所以我设置了一个带有一些常见功能的特征,如下所示:

trait Common[S, R] {

  def call(spark: SparkSession)(sourceDS: Dataset[S]): Dataset[R]

  def commonTr1(df: DataFrame): DataFrame = {
    df.withColumn("cmn1", lit(1))
  }

}

和示例实现:

object Source1 extends Common[SourceType, ResultType] {

  override def call(spark: SparkSession)(sourceDS: Dataset[SourceType]): Dataset[ResultType] = {
    import spark.implicits._

    sourceDS.toDF().transform(commonTr1).as[ResultType]
  }
}

但后来我有一些需要额外数据集的功能,例如:

  def call(spark: SparkSession, extraDS: Dataset[ExtraType])(sourceDS: Dataset[SourceType]): Dataset[ResultType] = {
    import spark.implicits._

    sourceDS.toDF().transform(commonTr1).join(extraDS.toDF(), "id", "left").as[ResultType]
  }

我尝试在特征中添加默认为 None 的 extraDS,并将泛型设置为 _ 或 Any 或类似的,或者通过添加重载函数,但还没有找到一种方法来完成这项工作,

例如:(不起作用)

trait Common[S, R, T] {

  def call(spark: SparkSession, extraDS: Option[Dataset[T]] = None)(sourceDS: Dataset[S]): Dataset[R]

  def commonTr1(df: DataFrame): DataFrame = {
    df.withColumn("cmn1", lit(1))
  }

}

object Source1 extends Common[SourceType, ResultType, _] {

  override def call(spark: SparkSession, extraDS: Option[Dataset[_]] = None)(sourceDS: Dataset[SourceType]): Dataset[ResultType] = {
    import spark.implicits._

    sourceDS.toDF().transform(commonTr1).as[ResultType]
  }
}

现在,首先:我很确定我在这里使用了错误的下划线关键字,其次:即使它有效,我也觉得它是一个糟糕的解决方案(因为“extraDS”要么是必需的,要么根本不使用,而且从不可选)。

有没有人对如何使这项工作提出建议,或对替代解决方案提出建议?

标签: scalaapache-sparkgenerics

解决方案


推荐阅读