2015-06-18 4 views
13

मैं अपाचे स्पार्क एमएलआईबीआईबी का उपयोग कर एक दस्तावेज़ वर्गीकरण को लागू करने की कोशिश कर रहा हूं और मुझे डेटा का प्रतिनिधित्व करने में कुछ समस्याएं आ रही हैं।डेटाफ्रेम से आरडीडी तक [लेबल किए गए पॉइंट]

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-आईडीएफ सुविधाओं बनाने की जरूरत: मेरी कोड निम्नलिखित है। समस्या तब प्रकट होती है जब मैं इस डेटाफ्रेम को आरडीडी [लेबलड पॉइंट] में परिवर्तित करने का प्रयास करता हूं। मैं डेटाफ्रेम पंक्तियों को मैप करता हूं, लेकिन पंक्ति की विधि विधि किसी भी प्रकार को वापस लौटाती है, डेटाफ्रेम स्कीमा (वेक्टर) पर परिभाषित प्रकार नहीं। इसलिए, मैं एक एमएल मॉडल को प्रशिक्षित करने के लिए आरडीडी का निर्माण नहीं कर सकता।

एक टीएफ-आईडीएफ की गणना के बाद आरडीडी [लेबलडपॉइंट] प्राप्त करने का सबसे अच्छा विकल्प क्या है?

उत्तर

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 
val labeled = tfidf.map(row => LabeledPoint(row.getDouble(0), row.getAs[Vector](4))) 
+3

मैं इस त्रुटि मिलती है: त्रुटि: प्रकार तर्क (वेक्टर) के प्रकार प्रकार पैरामीटर (प्रकार टी) की उम्मीद प्रकार के अनुरूप नहीं है। वेक्टर के प्रकार पैरामीटर टाइप टी के अपेक्षित पैरामीटर से मेल नहीं खाते हैं: प्रकार वेक्टर में एक प्रकार का पैरामीटर है, लेकिन टाइप टी में कोई भी – Miguel

+2

@ मिगुएल मुझे एक ही त्रुटि मिली है और [यहां] से एक अच्छा फिक्स मिला है (https: //community.hortonworks .com/प्रश्न/6020/टाइप-त्रुटि-जब-प्रयास-रैखिक-regression.html) आपको स्पार्क वेक्टर वर्ग को स्पष्ट रूप से आयात करने की आवश्यकता है क्योंकि स्कैला डिफ़ॉल्ट रूप से इसके अंतर्निर्मित वेक्टर प्रकार को आयात करता है। 'आयात org.apache.spark.mllib.linalg। {वेक्टर, वेक्टर}' और फिर क्रिस का कोड काम करेगा। – Ben

संबंधित मुद्दे