Plus de deux RDD[mllib.linalg.Vecteur]'s
J'ai besoin de plus de deux matrices qui sont stockées dans deux fichiers.
Le contenu de latest1.txt
et latest2.txt
a la prochaine str:
1 2 3 4 5 6 7 8 9
Je suis à la lecture de ces fichiers comme suit:
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
Je veux ajouter r1, r2. Donc, Est-il possible d'ajouter ces deux RDD[mllib.linalg.Vector]
s dans Apache Spark.
- Zip les deux RDDs ensemble, puis la carte le RDD
- ouais j'ai fait comme ça val rdd3=rdd1.zip(rdd2) scala> val rdd4 = rdd3.carte{ e => e._1 + e._2} et j'obtiens l'erreur :22: erreur: incompatibilité de type; trouvé : org.apache.spark.mllib.linalg.Vecteur requis: String val r4=r3.carte{e=>e._1 + e._2} puisqu'il n'y pas de + ou ajouter de l'opération sur mllib vecteurs de l'opération d'addition est définie sur util.Vecteurs
- Ressemble + n'est pas à l'opérateur d'ajouter deux Vecteurs de sorte que vous obtenez la valeur par défaut implict qui tente de convertir à la Chaîne.
- ouais ,mais je ne pouvais pas trouver n'importe quelle fonction ou l'exploitant qui effectuer une addition.
Vous devez vous connecter pour publier un commentaire.
C'est effectivement une bonne question. Je travaille avec mllib régulièrement et de ne pas se rendre compte de ces algèbre linéaire de base opérations ne sont pas facilement accessibles.
Le point est que le sous-jacent brise vecteurs ont tous de l'algèbre linéaire manipulations que vous attendez - y compris bien sûr l'élément de base sage plus que vous avez spécifiquement mentionné.
Cependant la brise de la mise en œuvre est caché du monde extérieur par l'intermédiaire de:
Alors, à partir du monde extérieur/API publique perspective, comment pouvons-nous accéder à ces primitives?
Certains d'entre eux sont déjà exposés: par exemple, la somme des carrés:
Cependant le choix de ces méthodes est limitée et, en fait, ne pas inclure les opérations de base, y compris l'élément de sage addition, soustraction, multiplication, etc.
Donc, ici, est le meilleur que j'ai pu voir:
Voici un exemple de code:
MLlib
n'est pas complète algèbre linéaire bibliothèque,Breeze
doit être utilisé, si de telles opérations sont nécessaires.error: not found: type DenseVector
import org.apache.spark.ml.linalg.DenseVector
?2**20
et je n'arrive pas à trouver un moyen efficace de gérer cela à la Scala.Le code suivant expose asBreeze et fromBreeze méthodes à partir de l'Étincelle. Cette solution prend en charge les
SparseVector
en contraste à l'aide devector.toArray
. Notez que l'Étincelle peut changer leur API dans l'avenir et a déjà renommétoBreeze
àasBreeze
.Avec ce que vous pouvez faire
df.withColumn("xy", addVectors($"x", $"y"))
.import org.apache.spark.mllib.linalg._
au lieu d'un fichier de définition de package? Si j'utilise comme je reçois un message d'erreur indiquant "illégal début de la définition de".