2015-01-30 8 views
12

का जोड़ मुझे दो फाइलों में संग्रहीत दो मैट्रिक्स के अतिरिक्त की आवश्यकता है।दो आरडीडी [mllib.linalg.Vector] के

 
1 2 3 
4 5 6 
7 8 9 

मैं इस प्रकार उन फ़ाइलों को पढ़ रहा हूँ:

scala> val rows = sc.textFile(“latest1.txt”).map { line => val values = line.split(‘ ‘).map(_.toDouble) 
    Vectors.sparse(values.length,values.zipWithIndex.map(e => (e._2, e._1)).filter(_._2 != 0.0)) 
} 

scala> val r1 = rows 
r1: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MappedRDD[2] at map at :14 

scala> val rows = sc.textFile(“latest2.txt”).map { line => val values = line.split(‘ ‘).map(_.toDouble) 
    Vectors.sparse(values.length,values.zipWithIndex.map(e => (e._2, e._1)).filter(_._2 != 0.0)) 
} 

scala> val r2 = rows 
r2: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MappedRDD[2] at map at :14 

मैं, आर 1 जोड़ने के लिए r2 चाहते

latest1.txt और latest2.txt की सामग्री के अगले str है। तो, अपाचे-स्पार्क में इन दो RDD[mllib.linalg.Vector] एस जोड़ने का कोई तरीका है।

+0

एक साथ दो RDDs ज़िप, फिर परिणामी RDD से अधिक नक्शा –

+0

हाँ मैं कि वैल rdd3 = rdd1.zip (rdd2) स्केला> वैल rdd4 = rdd3.map {ई => e._1 + ई की तरह था। _2} और मुझे त्रुटि मिल रही है: 22: त्रुटि: मिस्चैच टाइप करें; मिला: org.apache.spark.mllib.linalg.Vector आवश्यक: स्ट्रिंग वैल आर 4 = r3.map {e => e._1 + e।_2} चूंकि mllib वैक्टर पर कोई + या ऑपरेशन नहीं है, अतिरिक्त ऑपरेशन को उपयोग पर परिभाषित किया गया है। वेक्टर – krishna

+0

ऐसा लगता है कि + दो वेक्टर जोड़ने के लिए ऑपरेटर नहीं है, इसलिए आपको डिफ़ॉल्ट निहितार्थ मिल रहा है जो स्ट्रिंग में कनवर्ट करने का प्रयास करता है। –

उत्तर

19

यह वास्तव में एक अच्छा सवाल है। मैं नियमित रूप से mllib के साथ काम करता हूं और यह नहीं पता था कि इन बुनियादी रैखिक बीजगणित संचालन आसानी से सुलभ नहीं हैं। पाठ्यक्रम बुनियादी तत्व बुद्धिमान इसके अलावा की है कि आप विशेष रूप से उल्लेख किया सहित -

बिंदु अंतर्निहित हवा वैक्टर रेखीय बीजगणित जोड़तोड़ आप उम्मीद करेंगे के सभी होता है।

हालांकि हवा कार्यान्वयन के माध्यम से बाहर की दुनिया से छिपा हुआ है:

[private mllib] 

तो फिर बाहर की दुनिया/सार्वजनिक एपीआई के नजरिए से,, हम कैसे उन पुरातन उपयोग करते हैं?

उनमें से कुछ पहले से ही सामने आए हैं: उदा। वर्गों का योग:

/** 
* Returns the squared distance between two Vectors. 
* @param v1 first Vector. 
* @param v2 second Vector. 
* @return squared distance between two Vectors. 
*/ 
def sqdist(v1: Vector, v2: Vector): Double = { 
    ... 
} 

इस तरह के उपलब्ध तरीकों के चयन सीमित है हालांकि - और वास्तव में करता है नहीं तत्व बुद्धिमान इसके अलावा, घटाव, गुणा, आदि

तो यहाँ है सहित बुनियादी आपरेशन में शामिल सबसे अच्छा मैं देख सकता:

  • हवा
  • 01,235,164 में वेक्टर परिचालनों का निष्पादन करें:

    • हवा करने के लिए वैक्टर कन्वर्ट हवा से
    • Convert वापस वेक्टर

    mllib लिए यहां कुछ नमूना कोड है:

    val v1 = Vectors.dense(1.0, 2.0, 3.0) 
    val v2 = Vectors.dense(4.0, 5.0, 6.0) 
    val bv1 = new DenseVector(v1.toArray) 
    val bv2 = new DenseVector(v2.toArray) 
    
    val vectout = Vectors.dense((bv1 + bv2).toArray) 
    vectout: org.apache.spark.mllib.linalg.Vector = [5.0,7.0,9.0] 
    
    +0

    हां। 'एमएलआईबीबी' एक पूर्ण रैखिक बीजगणित पुस्तकालय नहीं है, यदि ऐसे परिचालनों की आवश्यकता है तो 'ब्रीज़' का उपयोग किया जाना चाहिए। –

    +0

    लेकिन अगर वेक्टर स्पैस है तो क्या होगा। मैं वर्तमान में स्पैस वेक्टर में हेरफेर कर रहा हूं। लेकिन यदि वेक्टर को बदलने के लिए अपना रास्ता उपयोग करते हैं, तो इसकी अधिक स्मृति होगी और गणना की गति धीमी होगी। यह अजीब बात है कि pyspark आसानी से इस ऑपरेशन कर सकते हैं। तो मैं इसके बजाय अजगर का उपयोग कर सोच रहा हूँ। – deathlee

    +0

    यह वास्तव में मैं कोशिश कर रहा हूं .. [लेकिन मैं यहां क्या गलत कर रहा हूं] (http://stackoverflow.com/questions/36581220/why-can-i-only-retrieve-arrayfloat-word-vectors-but- है-टू-पास mllib-linalg)? – displayname

    1

    निम्नलिखित कोड स्पार्क से उजागर करता है asBreeze और fromBreeze तरीकों। यह समाधान vector.toArray का उपयोग करने के विपरीत SparseVector का समर्थन करता है। ध्यान दें कि स्पार्क भविष्य में अपना एपीआई बदल सकता है और पहले ही toBreeze से asBreeze का नाम बदल चुका है।

    package org.apache.spark.mllib.linalg 
    import breeze.linalg.{Vector => BV} 
    import org.apache.spark.sql.functions.udf 
    
    /** expose vector.toBreeze and Vectors.fromBreeze 
        */ 
    object VectorUtils { 
    
        def fromBreeze(breezeVector: BV[Double]): Vector = { 
        Vectors.fromBreeze(breezeVector) 
        } 
    
        def asBreeze(vector: Vector): BV[Double] = { 
        // this is vector.asBreeze in Spark 2.0 
        vector.toBreeze 
        } 
    
        val addVectors = udf { 
        (v1: Vector, v2: Vector) => fromBreeze(asBreeze(v1) + asBreeze(v2)) 
        } 
    
    } 
    

    इसके साथ आप df.withColumn("xy", addVectors($"x", $"y")) कर सकते हैं।

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