2016-10-28 60 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?我寫這段代碼的時候用了這個答案(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))