2015-10-09 13 views
6

मैं स्पार्क और स्कैला के लिए अपेक्षाकृत नया हूं।आरडीडी [org.apache.spark.sql.Row] को आरडीडी में परिवर्तित करना [org.apache.spark.mllib.linalg.Vector]

मैं निम्नलिखित dataframe के साथ शुरू कर रहा हूँ (एकल स्तंभ डबल्स के एक घने वेक्टर से बाहर कर दिया):

scala> val scaledDataOnly_pruned = scaledDataOnly.select("features") 
scaledDataOnly_pruned: org.apache.spark.sql.DataFrame = [features: vector] 

scala> scaledDataOnly_pruned.show(5) 
+--------------------+ 
|   features| 
+--------------------+ 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
+--------------------+ 

RDD के लिए एक सीधे रूपांतरण org.apache.spark.rdd.RDD का एक उदाहरण [पैदावार org.apache.spark.sql.Row]:

scala> val scaledDataOnly_rdd = scaledDataOnly_pruned.rdd 
scaledDataOnly_rdd: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[32] at rdd at <console>:66 

किसी को भी कैसे की org.apache.spark.rdd.RDD [org.apache.spark.mllib.linalg एक उदाहरण के लिए इस DF कन्वर्ट करने के लिए पता है। वेक्टर] इसके बजाए? मेरे विभिन्न प्रयास अब तक असफल रहे हैं।

किसी भी पॉइंटर्स के लिए अग्रिम धन्यवाद!

उत्तर

6

बस पता चला:

val scaledDataOnly_rdd = scaledDataOnly_pruned.map{x:Row => x.getAs[Vector](0)} 
5

संपादित करें: पंक्ति में खेतों व्याख्या करने के लिए और अधिक परिष्कृत तरीके से उपयोग।

यह मैं

val featureVectors = features.map(row => { 
    Vectors.dense(row.toSeq.toArray.map({ 
    case s: String => s.toDouble 
    case l: Long => l.toDouble 
    case _ => 0.0 
    })) 
}) 

सुविधाओं के लिए काम किया है चिंगारी एसक्यूएल का एक DataFrame है।

0
import org.apache.spark.mllib.linalg.Vectors 

scaledDataOnly 
    .rdd 
    .map{ 
     row => Vectors.dense(row.getAs[Seq[Double]]("features").toArray) 
    } 
संबंधित मुद्दे