从数据帧到RDD [LabeledPoint]

问题描述 投票:15回答:2

我试图使用Apache星火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)))

我需要使用dataframes生成的令牌,并创建了TF-IDF功能。当我尝试这个数据帧转换为RDD [LabeledPoint]出现的问题。我映射数据帧行,但行的get方法返回的数据帧模式(矢量)定义的任何类型,而不是类型。因此,我不能构建我需要培养ML模型RDD。

什么是获得最佳选项RDD [LabeledPoint]计算TF-IDF之后?

scala apache-spark apache-spark-mllib
2个回答
6
投票

铸造对象为我工作。

尝试:

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

1
投票

您需要使用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)))
© www.soinside.com 2019 - 2024. All rights reserved.