Я пытаюсь реализовать классификатор документов с помощью 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)))
Мне нужно использовать dataframes для создания токенов и создания функций TF-IDF. Проблема возникает, когда я пытаюсь преобразовать этот файл данных в RDD [LabeledPoint]. Я сопоставляю строки dataframe, но метод get Row возвращает тип Any, а не тип, определенный в схеме dataframe (Vector). Поэтому я не могу построить RDD, мне нужно обучить модель ML.
Каков наилучший вариант для получения RDD [LabeledPoint] после вычисления TF-IDF?