2016-04-11 63 views
4

我正在使用spark ML管道在真正寬的表格上設置分類模型。這意味着我必須自動生成所有處理列的代碼,而不是精確地輸入它們中的每一個。我幾乎是一個初學者在Scala和火花。當我嘗試做如下操作時,我被卡在VectorAssembler()部分:Spark ML VectorAssembler()處理數據幀中的數千列

val featureHeaders = featureHeader.collect.mkString(" ") 
//convert the header RDD into a string 
val featureArray = featureHeaders.split(",").toArray 
val quote = "\"" 
val featureSIArray = featureArray.map(x => (s"$quote$x$quote")) 
//count the element in headers 
val featureHeader_cnt = featureHeaders.split(",").toList.length 


// Fit on whole dataset to include all labels in index. 
import org.apache.spark.ml.feature.StringIndexer 
val labelIndexer = new StringIndexer(). 
    setInputCol("target"). 
    setOutputCol("indexedLabel") 

val featureAssembler = new VectorAssembler(). 
    setInputCols(featureSIArray). 
    setOutputCol("features") 

val convpipeline = new Pipeline(). 
    setStages(Array(labelIndexer, featureAssembler)) 

val myFeatureTransfer = convpipeline.fit(df) 

顯然它沒有工作。我不確定我該怎麼做才能讓整個事情變得更加自動化,或者ML管道在這一刻不會佔用那麼多列(我懷疑)?

+0

這仍然不適用於我。我認爲我的輸入數據框很好。我可以很容易地創建一個標記點​​,將其輸入到MLlib中,但不能用於ML管道。請指教,謝謝! –

回答

0

除非列名包含引號,否則不應使用引號(s"$quote$x$quote")。嘗試

val featureAssembler = new VectorAssembler(). 
    setInputCols(featureArray). 
    setOutputCol("features") 
+0

謝謝,但使用featureArray也無法正常工作。它給出了這個錯誤: WARN TaskSetManager:在階段28.0中丟失的任務0.2:java.lang.ArrayIndexOutOfBoundsException 錯誤TaskSetManager:階段28.0中的任務0失敗4次;中止作業 org.apache.spark.SparkException:由於階段失敗而導致作業中止:階段28.0中的任務0失敗4次,最近一次失敗:java.lang.ArrayIndexOutOfBoundsException –

+0

它與此無關。看起來你有不正確的數據。 –

+0

感謝您的幫助,我將重新審視我的輸入數據。 =) –

0

我終於想出了一種方法,這不是很漂亮。它是爲特徵創建vector.dense,然後創建數據框架。

import org.apache.spark.mllib.regression.LabeledPoint 
val myDataRDDLP = inputData.map {line => 
val indexed = line.split('\t').zipWithIndex 
val myValues = indexed.filter(x=> {x._2 >1770}).map(x=>x._1).map(_.toDouble) 
val mykey = indexed.filter(x=> {x._2 == 3}).map(x=>(x._1.toDouble-1)).mkString.toDouble 
LabeledPoint(mykey, Vectors.dense(myValues)) 
} 
val training = sqlContext.createDataFrame(myDataRDDLP).toDF("label", "features")