У меня есть DataFrame со многими столбцами. У меня также есть функция,Scala: variadic UDF
def getFeatureVector(features:Array[String]) : Vector
, что является довольно сложным, но занимает несколько строк и возвращает искровой MLlib вектор.
Теперь я хочу посмотреть на некоторые столбцы в DF (я не знаю, что заранее), передать их getFeatureVector и добавить новый столбец, содержащий результирующие векторы.
У меня есть доступ к массиву столбцов, которые я хочу использовать, и я написал функцию, которая бросает его в строку, и делает столбец массива:
val colNamesToEncode = Array("col1", "col2", "col3", "col4")
def getColsToEncode:Column = {
val cols = colNamesToEncode.map(x => col(x).cast("string"))
array(cols:_*)
}
Наконец, я пытаюсь сделать UDF и применить его к DF:
val encoderUDF = udf(getFeatureVector _)
val cols = getColsToEncode()
data.withColumn(featuresColName,encoderUDF(cols))
, но когда я бегу, что я получаю java.lang.RuntimeException: неподдерживаемых буквальным класса типа scala.runtime.BoxedUnit()
Как я могу применить к функции дляDF?
PS: Я использовал этот ответ (Spark UDF with varargs) в качестве руководства при написании кода.