我想在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
一起使用。
有没有合适的方式?
答案 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")))