Itérer un Java CA en ligne
Je voudrais faire une itération sur un CA de chaînes et de "faire quelque chose" pour chaque chaîne. La sortie doit être double[][]
. Voici un exemple avec une boucle for. Je comprends que j'ai besoin de l'utiliser (je pense) le foreach
fonction de Java RDDs. Cependant, je n'ai aucune idée de la façon de comprendre la syntaxe. La Documentation n'est pas particulièrement utile. Je n'ai pas de Java 8.
Voici un exemple de ce que je voudrais faire si je pouvais utiliser un for
boucle.
public class PCA {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("PCA Example");
SparkContext sc = new SparkContext(conf);
RDD<String> data = sc.textFile("my/directory/my/dataset.txt", 0);
//here is the "type" of code I would like to execute
//30 because I have 30 variables
double[][] vals = new double[data.count()][30];
double[] temp;
for (int i = 0; i < data.count(); i++) {
temp = splitStringtoDoubles(data[i]);
vals[i] = temp;
}
}
private static double[] splitStringtoDoubles(String s) {
String[] splitVals = s.split("\\t");
Double[] vals = new Double[splitVals.length];
for (int i = 0; i < splitVals.length; i++) {
vals[i] = Double.parseDouble(splitVals[i]);
}
}
}
Je comprends que foreach
semble avoir besoin d'une fonction qui a un type de retour void. Vous ne savez pas comment l'utiliser. Voici ce que j'ai essayé jusqu'à présent (évidemment, la syntaxe est mauvaise):
double[][] matrix = new double[data.count()][30];
foreach(String s : data) {
String[] splitvals = s.split("\\t");
double[] vals = Double.parseDouble(splitvals);
matrix[s] = vals;
}
map
au lieu de foreach
et le retour d'une nouvelle matrice pour chaque chaîne.Seriez-vous en mesure de fournir un exemple, @mattinbits? Comme je l'ai dit, je ne suis pas familier avec Spark Java et la plupart des exemples de carte j'ai vu ont été en java 8 avec les lambda fonctions, je ne peux pas utiliser.
J'ai pu faire au cours de la Scala, mais pas Java la réponse ci-dessous à partir de @Balduz semble si bon
OriginalL'auteur Katya Handler | 2015-08-05
Vous devez vous connecter pour publier un commentaire.
Comme mattinbits dit dans les commentaires, vous voulez un
map
au lieu d'unforeach
, puisque vous voulez des valeurs de retour. Quelmap
ne fondamentalement, c'est de transformer vos données: pour chaque ligne de votre CA vous effectuez une opération et retourner une valeur pour chaque ligne. Ce dont vous avez besoin peut être réalisé comme ceci:De sorte que vous savez comment Spark fonctionne, vous effectuez des actions ou des transformations sur votre CA. Par exemple, ici, nous sommes à la transformation de notre CA à l'aide d'un
map
fonction. Vous devez créer cette fonction vous-même, cette fois, avec un anonymeorg.apache.spark.api.java.function.Function
qui vous oblige à remplacer la méthodecall
, où vous recevez une rangée de votre CA et de retourner une valeur.OriginalL'auteur Balduz
Juste parce que c'est intéressant de comparer la verbosité désirée de la Java vs Scala API pour Spark, voici une version Scala:
map
. Hélas, je dois utiliser Java pour ce cas.Bonne chance alors 🙂
Moi aussi, je préfère Scala pour Spark, que Java est beaucoup plus de commentaires... Malheureusement, mon Scala compétences sont inexistants 🙁
OriginalL'auteur mattinbits