2016-04-11 9 views
4

私はスパークMLパイプラインを使って、本当に広いテーブルで分類モデルを設定していました。つまり、それぞれの文字を実際に入力するのではなく、列を扱うすべてのコードを自動的に生成する必要があります。私はスカラとスパークの初心者です。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) 

をどうやらそれは動作しませんでした:私は、次のような何かをしようとしていたとき、私はVectorAssembler()部分に貼り付けました。私は全体をもっと自動化するために何をすべきか、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") 
関連する問題