使用泛型类型和额外参数

时间:2017-06-30 08:35:57

标签: scala apache-spark-sql

我想在scala spark中定义一个UDF,如下面的伪代码:

def transformUDF(size:Int):UserDefinedFunction = udf((input:Seq[T]){

  if (input != null)
    Vectors.dense(input.map(_.toDouble).toArray)
  else
    Vectors.dense(Array.fill[Double](size)(0.0))

})

如果input不为null,则将每个元素强制转换为Double Type 如果input为null,则返回一个全零向量。

我希望T限制为数字类型,例如Java中的java.lang.Number。但似乎Seq[java.lang.Number]无法与toDouble一起使用。

有没有合适的方式?

1 个答案:

答案 0 :(得分:1)

正如我在工作评论中提到的

def transformUDF: UserDefinedFunction = udf((size: Int, input:Seq[java.lang.Number]) => {
  if (input != null)
    Vectors.dense(input.map(_.doubleValue()).toArray)
  else
    Vectors.dense(Array.fill[Double](size)(0.0))
})

您无需创建新列,只需将其作为

传递给udf函数即可
dataframe.withColumn("newCol", transformUDF(lit(the size you want), dataframe("the column you want to transform")))