Scala 从数据帧到RDD[标签点]

Scala 从数据帧到RDD[标签点],scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我正在尝试使用ApacheSarkMLLIB实现一个文档分类器,但是在表示数据时遇到了一些问题。我的代码如下: 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.feat

我正在尝试使用ApacheSarkMLLIB实现一个文档分类器,但是在表示数据时遇到了一些问题。我的代码如下:

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]时,问题出现了。我映射了dataframe行,但是Row的get方法返回一个Any类型,而不是dataframe模式(Vector)上定义的类型。因此,我无法构造训练ML模型所需的RDD


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

您需要使用
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)))

铸造这个物体对我很有用

尝试:


我得到了这个错误:错误:类型参数(Vector)的类型不符合类型参数(T类型)的预期类型。向量的类型参数与类型T的预期参数不匹配:类型向量有一个类型参数,但类型T有一个类型参数none@Miguel我也遇到了同样的错误,并从中找到了一个很好的解决方案,因为Scala默认导入其内置向量类型,所以需要显式导入Spark向量类<代码>导入org.apache.spark.mllib.linalg.{Vector,Vectors}然后Chris的代码就可以工作了。
// Create labeled points
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row(4).asInstanceOf[Vector]))