2016-10-28 6 views
2

У меня есть 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) в качестве руководства при написании кода.

ответ

0

Просто удалите () из приведенной ниже строки, которая устранила ошибку.

От val cols = getColsToEncode()

Для

val cols = getColsToEncode 
0

Вы можете непосредственно передать функцию в UDF функции.

val colNamesToEncode = Array("col1", "col2", "col3", "col4") 
def getColsToEncode:Column = { 
val cols = colNamesToEncode.map(x => col(x).cast("string")) 
array(cols:_*) 
} 

val encoderUDF = udf(getFeatureVector _) 
data.withColumn(featuresColName,encoderUDF(getColsToEncode)) 

 Смежные вопросы

  • Нет связанных вопросов^_^