2015-06-18 22 views
13

Tôi đang cố triển khai trình phân loại tài liệu bằng Apache Spark MLlib và tôi đang gặp một số vấn đề thể hiện dữ liệu. Mã của tôi là như sau:Từ DataFrame tới RDD [LabeledPoint]

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))) 

Tôi cần sử dụng các khung dữ liệu để tạo mã thông báo và tạo các tính năng TF-IDF. Sự cố xuất hiện khi tôi cố chuyển đổi khung dữ liệu này thành RDD [LabeledPoint]. Tôi ánh xạ các hàng dataframe, nhưng phương thức get của Row trả về một kiểu bất kỳ, không phải kiểu được định nghĩa trên lược đồ dataframe (Vector). Vì vậy, tôi không thể xây dựng RDD tôi cần đào tạo một mô hình ML.

Tùy chọn tốt nhất để nhận RDD [LabeledPoint] sau khi tính TF-IDF là gì?

Trả lời

6

Đúc các đối tượng làm việc cho tôi.

Hãy thử:

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

Bạn cần phải sử dụng getAs[T](i: Int): T

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

tôi nhận được lỗi này: lỗi: các loại của các đối số kiểu (Vector) không phù hợp với các loại dự kiến ​​của các tham số kiểu (loại T). Thông số loại của Vector không khớp với thông số dự kiến ​​của loại T: loại Vector có một thông số loại, nhưng loại T không có – Miguel

+2

@Miguel Tôi gặp lỗi tương tự và tìm thấy sửa chữa tốt từ [đây] (https: //community.hortonworks .com/questions/6020/type-error-khi-try-linear-regression.html) Bạn cần nhập khẩu lớp Spark Vector một cách rõ ràng vì Scala nhập khẩu kiểu Vector được xây dựng của nó theo mặc định. 'nhập org.apache.spark.mllib.linalg. {Vector, Vectors}' và sau đó mã của Chris sẽ hoạt động. – Ben

Các vấn đề liên quan