我试图遍历自定义案例类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)