2015-10-24 16 views
6

मैं चिंगारी में मिलता है और मैं वेक्टर आयात org.apache.spark.mllib.linalg साथ कोई समस्या है {वेक्टर, वेक्टर}स्पार्क: इनपुट एक वेक्टर

मेरा कार्यक्रम के इनपुट एक पाठ फ़ाइल है। dataset.txt:

[-0.5069793074881704,-2.368342680619545,-3.401324690974588] 
[-0.7346396928543871,-2.3407983487917448,-2.793949129209909] 
[-0.9174226561793709,-0.8027635530022152,-1.701699021443242] 
[0.510736518683609,-2.7304268743276174,-2.418865539558031] 

तो, क्या करना है एक कोशिश है: एक RDD (वेक्टर) के उत्पादन में शामिल हैं के साथ

val rdd = sc.textFile("/workingdirectory/dataset") 
val data = rdd.map(s => Vectors.dense(s.split(',').map(_.toDouble))) 

मैं त्रुटि है, क्योंकि यह पढ़ [०.५१०७३६ 518683609 एक संख्या के रूप में। दूसरी पंक्ति के बिना पाठ फ़ाइल में संग्रहीत वेक्टर को सीधे लोड करने के लिए किसी भी फॉर्म का अस्तित्व है? मैं मानचित्र चरण में "[" कैसे हटा सकता हूं? मैं स्पार्क में वास्तव में नया हूं, क्षमा करें अगर यह एक बहुत ही स्पष्ट सवाल है।

val rdd = sc.textFile("/workingdirectory/dataset") 
val data = rdd.map { 
    s => 
    val vect = s.replaceAll("\\[", "").replaceAll("\\]","").split(',').map(_.toDouble) 
    Vectors.dense(vect) 
} 

मैं सिर्फ पठनीयता प्रयोजन के लिए लाइन में नक्शा तोड़ दिया गया है:

उत्तर

1

यहाँ एक तरह से यह करने के लिए है।

नोट: याद रखें, यह प्रत्येक पंक्ति पर एक स्ट्रिंग प्रसंस्करण सरल है।

+0

कैसे के बारे में 'ड्रॉप (1) .dropRight (1) .split (", ") मानचित्र' या 'वैल पी =" - [0-9] + (:। \\ [0-9] +) "r;?। p.findAllIn (रों) .map (_। toDouble) '? – zero323

+0

यही कारण है कि मैंने एक तरफ कहा! :) – eliasah

4

इनपुट सरल बात आप कर सकते हैं Vectors.parse उपयोग करने के लिए है यह देखते हुए:

scala> import org.apache.spark.mllib.linalg.Vectors 
import org.apache.spark.mllib.linalg.Vectors 

scala> Vectors.parse("[-0.50,-2.36,-3.40]") 
res14: org.apache.spark.mllib.linalg.Vector = [-0.5,-2.36,-3.4] 

यह भी विरल प्रतिनिधित्व के साथ काम करता है:

scala> Vectors.parse("(10,[1,5],[0.5,-1.0])") 
res15: org.apache.spark.mllib.linalg.Vector = (10,[1,5],[0.5,-1.0]) 

अपने डेटा के साथ यह मेल आप सभी की जरूरत है:

rdd.map(Vectors.parse) 

यदि आप विकृत/खाली लाइनों की अपेक्षा करते हैं तो आप इसे लपेट सकते हैं ing Try:।? (। _ toDouble)

import scala.util.Try 

rdd.map(line => Try(Vectors.parse(line))).filter(_.isSuccess).map(_.get) 
+1

मुझे यह भी पता नहीं था कि विधि मौजूद है! धन्यवाद – eliasah

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