2016-10-18 6 views
3

誰かが下記のエラーで私を助けてくれますか?私は回帰モデル構築に使用できるように、データフレームをrddに変換しようとしています。ClassCastException:org.apache.spark.ml.linalg.DenseVectorをorg.apache.spark.mllib.linalg.Vectorにキャストすることはできません

SPARKバージョン:2.0.0

エラー=> のClassCastException:org.apache.spark.ml.linalg。 DenseVectorは、 org.apache.spark.mllib.linalgにキャストできません。 ベクトル

コード=>

import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS 
import org.apache.spark.mllib.linalg.Vectors 
import org.apache.spark.mllib.regression.LabeledPoint 
import org.apache.spark.rdd.RDD 
import org.apache.spark.sql._ 
import org.apache.spark.sql.Row 

val binarizer2: Binarizer = new Binarizer() 
    .setInputCol("repay_amt").setOutputCol("label").setThreshold(20.00) 

df = binarizer2.transform(df) 

val assembler = new VectorAssembler() 
.setInputCols(Array("tot_txns", "avg_unpaiddue", "max_unpaiddue", "sale_txn", "max_amt", "tot_sale_amt")).setOutputCol("features") 

df = assembler.transform(df) 

df.write.mode(SaveMode.Overwrite).parquet("lazpay_final_data.parquet") 

val df2 = spark.read.parquet("lazpay_final_data.parquet/") 
val df3= df2.rdd.map(r => LabeledPoint(r.getDouble(0),r.getAs("features"))) 

データ=>

enter image description here

+1

の可能性のある重複[MatchErrorスパーク2.0のベクトル列にアクセスしている間(http://stackoverflow.com/questions/38818879/matcherror-while-accessing-vector-column-in- spark-2-0) –

+0

私はspark 2.0.0を使用しています –

答えて

2

あなたは、私がスパーク2.0以上、 代わりの輸入org.apache.spark.mllib.linalg.Vectors 使用輸入org.apache.spark.ml.linalg.Vectors

3

私は同じ問題に走ったし、手動で値をキャストする機能を作成しました:

public static Function<Row, org.apache.spark.mllib.linalg.Vector> rowToVector = new Function<Row, org.apache.spark.mllib.linalg.Vector>() { 
    public org.apache.spark.mllib.linalg.Vector call(Row row) throws Exception { 
     Object features = row.getAs(0); 
     org.apache.spark.ml.linalg.DenseVector dense = null; 

     if (features instanceof org.apache.spark.ml.linalg.DenseVector){ 
      dense = (org.apache.spark.ml.linalg.DenseVector)features; 
     } 
     else if(features instanceof org.apache.spark.ml.linalg.SparseVector){ 
      org.apache.spark.ml.linalg.SparseVector sparse = (org.apache.spark.ml.linalg.SparseVector)features; 
      dense = sparse.toDense(); 
     }else{ 
      RuntimeException e = new RuntimeException("Cannot convert to "+ features.getClass().getCanonicalName()); 
      LOGGER.error(e.getMessage()); 
      throw e; 
     } 
     org.apache.spark.mllib.linalg.Vector vec = org.apache.spark.mllib.linalg.Vectors.dense(dense.toArray()); 
     return vec; 
    } 

}; 
1

を使用しているので最初にml SparseVectorをDense Vectorに変換してからmllib Vectorに変換してこの問題を解決しました。

例:

val denseVector = r.getAs[org.apache.spark.ml.linalg.SparseVector]("features").toDense 
    org.apache.spark.mllib.linalg.Vectors.fromML(denseVector) 
関連する問題