web-dev-qa-db-ja.com

DataFrameからRDD [LabeledPoint]へ

Apache Spark MLlibを使用してドキュメント分類子を実装しようとしていますが、データの表現に問題があります。コードは次のとおりです。

import org.Apache.spark.sql.{Row, SQLContext}
import org.Apache.spark.sql.types.{StringType, StructField, StructType}
import org.Apache.spark.ml.feature.Tokenizer
import org.Apache.spark.ml.feature.HashingTF
import org.Apache.spark.ml.feature.IDF

val sql = new SQLContext(sc)

// Load raw data from a TSV file
val raw = sc.textFile("data.tsv").map(_.split("\t").toSeq)

// Convert the RDD to a dataframe
val schema = StructType(List(StructField("class", StringType), StructField("content", StringType)))
val dataframe = sql.createDataFrame(raw.map(row => Row(row(0), row(1))), schema)

// Tokenize
val tokenizer = new Tokenizer().setInputCol("content").setOutputCol("tokens")
val tokenized = tokenizer.transform(dataframe)

// TF-IDF
val htf = new HashingTF().setInputCol("tokens").setOutputCol("rawFeatures").setNumFeatures(500)
val tf = htf.transform(tokenized)
tf.cache
val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(tf)
val tfidf = idfModel.transform(tf)

// Create labeled points
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row.get(4)))

データフレームを使用してトークンを生成し、TF-IDF機能を作成する必要があります。このデータフレームをRDD [LabeledPoint]に変換しようとすると、問題が発生します。データフレームの行をマップしましたが、Rowのgetメソッドは、データフレームスキーマ(Vector)で定義された型ではなく、Any型を返します。したがって、MLモデルをトレーニングするために必要なRDDを構築できません。

TF-IDFを計算した後にRDD [LabeledPoint]を取得するための最良のオプションは何ですか?

15
Miguel

オブジェクトをキャストすることは私のために働いた。

試してください:

// Create labeled points
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row(4).asInstanceOf[Vector]))
6
zzztimbo

getAs[T](i: Int): Tを使用する必要があります

// Create labeled points
import org.Apache.spark.mllib.linalg.{Vector, Vectors}
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row.getAs[Vector](4)))
1
Chris