通用案例类

时间:2018-03-16 14:45:18

标签: scala apache-spark shapeless

我试图遍历自定义案例类RichColumnT的HList以将列添加到spark Dataframe - Spark Dataframe / Dataset API提供df.withColumn(columnName,col("")) - &gt ;我使用implicits构建了API,以便能够执行类似的操作 - df.addColumn[String]

并且图书馆会这样做 df.withColumn("someColumn", lit(""))

例如,lit("")是String列数据类型的默认值。现在我想能够使用RichColumns的HList来做这种事情,其中​​T类型参数是不同的。

例如。某种程度上richColumnsHlist.map(PolyFunctionThatLooksLikeBelowButOnDifferentTType)

有什么建议吗?这是我到目前为止的代码 -

import scala.reflect.runtime.universe._
  case class RichColumn[T](name: String)

  implicit class DataFrameImplicits(dataFrame: DataFrame) {

    def addColumn[T: TypeTag](name: String): DataFrame = {
      val t = typeOf[T]
      val df: DataFrame =  t match {
        case x if typeOf[T] <:< typeOf[String] ⇒ dataFrame.withColumn(name, lit(""))
        case x if typeOf[T] <:< typeOf[Int] ⇒ dataFrame.withColumn(name, lit(0))
        case x if typeOf[T] <:< typeOf[Double] ⇒ dataFrame.withColumn(name, lit(0d))
        case x if typeOf[T] <:< typeOf[Float] ⇒ dataFrame.withColumn(name, lit(0f))
      }
      df
    }
  }
}
object DataFrameAddColumnTest extends App {
  import Functions._
  import org.apache.spark.sql.SparkSession
  val spark = SparkSession.builder().master("local").getOrCreate()
  import spark.implicits._
  val df = Seq(1,2,3).toDF
  df.addColumn[Int]("addedColumn").columns.foreach(println)
}

这是我的

case class RichColumn[T](name: String)

0 个答案:

没有答案
相关问题