Convertir Étincelle Ligne tapé Tableau de Doubles
Je suis en utilisant Étincelle 1.3.1 avec la Ruche et avoir une ligne d'objet qui est une longue série de doubles pour être transmis à un Vecors.dense constructeur, mais quand je convertir une Ligne à un tableau via
SparkDataFrame.map{r => r.toSeq.toArray}
Tout type d'information est perdue, et je récupère un tableau de [Toute] type. Je suis incapable de jeter cet objet à double en utilisant
SparkDataFrame.map{r =>
val array = r.toSeq.toArray
array.map(_.toDouble)
} //Fails with value toDouble is not a member of any
comme
SparkDataFrame.map{r =>
val array = r.toSeq.toArray
array.map(_.asInstanceOf[Double])
} //Fails with java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
Je vois que la Ligne d'objet a une API qui prend en charge spécifiques par des éléments comme un type, par le biais de:
SparkDataFrame.map{r =>
r.getDouble(5)}
Cependant cas d'échec avec java.lang.Entier ne peut pas être jeté à java.lang.Double
Le seul travail que j'ai trouvé est la suivante:
SparkDataFrame.map{r =>
doubleArray = Array(r.getInt(5).toDouble, r.getInt(6).toDouble)
Vectors.dense(doubleArray) }
Cependant, ce serait trop fastidieux lorsque l'indice de 5 à 1000 doivent être convertis à un tableau de double.
Moyen de contourner explicitement l'indexation de la ligne de l'objet?
OriginalL'auteur user2726995 | 2015-05-20
Vous devez vous connecter pour publier un commentaire.
Regardons vos blocs de code 1 par 1
Carte renvoie la dernière déclaration que le type (c'est à dire il y a une sorte d'implicite de retour sur n'importe quelle fonction en Scala que le dernier résultat est à votre valeur de retour). Votre dernier relevé est de type Unit (comme Void).. parce que l'affectation d'une variable à un val sans retour. Pour corriger cela, prendre de la mission (ce qui a aussi pour avantage d'être moins de code à lire).
_.toDouble
est pas une fonte..vous pouvez le faire sur une Chaîne ou dans votre cas, un Entier, et il va changer l'instance de la variable type. Si vous appelez_.toDouble
sur un Int, c'est plus comme faisantDouble.parseDouble(inputInt)
._.asInstanceOf[Double]
serait jeté.. qui si vos données est vraiment un double, serait de changer le type. Mais pas sûr que vous avez besoin de jeter ici, éviter de jeter si vous le pouvez.Mise à jour
Si vous avez modifié le code de cette
Vous appelez toDouble sur un nœud de votre SparkDataFrame. Apparemment ce n'est pas quelque chose qui a une toDouble méthode.. c'est à dire qu'il n'est pas un entier ou une Chaîne de caractères ou un Long.
Si cela fonctionne
Mais vous devez le faire à partir de 5 à 1000.. pourquoi ne pas faire
donner à quelqu'un un -1 qui est d'essayer de répondre à votre question n'est pas une bonne façon d'obtenir de l'aide
J'apprécie toutes et tous de l'aide, un downvote n'est pas personnel, c'est juste que la solution ne permet pas de répondre à la question directe à portée de main
Cela a fonctionné, merci,
Pour la postérité ((i <- 2 pour enregistrer.taille) record de rendement.getInt(i).toDouble).toArray
OriginalL'auteur bwawok
vous devez utiliser le Double.parseDouble à partir de java.
OriginalL'auteur Jason
Avait un semblable, plus difficile, problème que mes traits ne sont pas tous à Double. Voici comment j'ai pu convertir mon DataFrame (tiré de la table de la Ruche) pour un LabeledPoint RDD:
OriginalL'auteur Edi Bice