2016-06-28 12 views
0

ich bin neu zu funken, ich möchte ein JavaPairRDD erstellen, um in der Lage zu sein, es zu sortieren und zwischen Schlüsseln zu vergleichen, wie es das Beispiel des Codes unten zeigt, habe ich versucht, ein zu erstellen JavaPairRDD, aber nach der Verwendung der Funktion sortByKey(), habe ich festgestellt, dass es Schlüssel als Strings nicht als Ganzzahlen behandelt.wie man ein Paar rdd mit einem Int-Schlüssel

JavaRDD<String> csvFileC = sc.textFile(currentFile); 
    JavaPairRDD<Integer, String> pairsC = csvFileC.mapToPair(new keyData()).sortByKey(true).cache(); 

zum Beispiel, wenn pairsC folgende Elemente enthält:

(1, as), (2, du), (12, ER), (3, Cu), (22, hh

)

so, nachdem es sortByKey() und Anzeige wieder mit finde ich es mag:

(1, as), (12, r), (2, Sie), (22, hh), (3, cu)

was bedeutet, es Tasten als Strings nicht als ganze Zahlen behandelt, aber das Ergebnis, das ich sehen ist wie folgt:

(1, as), (2, Sie), (3, cu) , (12, er), (22, hh)

also wie kann ich mit meinen Schlüsseln als int umgehen? , um weitere Informationen, ist dies die Funktion keyData, die ich verwende, um die RDD zu einer Arbeit PairRDD

public static class keyData implements PairFunction <String, Integer, String> 
    { 
    public Tuple2<Integer, String> call(String x) { 
    String[] strs = x.split(","); 
     return new Tuple2(strs[0], x.replaceFirst(strs[0]+",", "")); 
    } 

Antwort

0

Hat Ihr Code selbst zu verwandeln? Der Rückgabetyp des call ist Tuple2<Integer, String>, aber wenn Sie das neue Tuple2 erstellen, ist es vom Typ Tuple2<String, String>. Um dieses Problem zu beheben, können Sie Ihren String in Integer einfach konvertieren:

return new Tuple2(Integer.parseInt(strs[0]), x.replaceFirst(strs[0]+",", "")); 

Darüber hinaus stellen Sie sicher, nur ganze Zahlen haben in Ihrem ersten Teilelement. Normalerweise muss ein Header der Datei entfernt oder übersprungen werden, falls vorhanden, um NumberFormatExceptions zu vermeiden.

Geben Sie jedoch einen Komparator zu sortByKey finden Sie in der JavaDocs für weitere Informationen. Dies wird wie in etwas führen:

JavaPairRDD<Integer, String> parisC = 
csvFileC.sortByKey(Comparator.comparing(tuple2 -> tuple2._1, true); 
+0

ist es nicht möglich, Aufruf ändern, damit es ein Tuple2 zurückgibt ? Wenn ja, wie? weil ich Keys als Ganzzahlen brauche – hammadspark

+0

Ja ist es, ich erweiterte meine Antwort ein wenig. –

+0

und vielleicht ist es unlogisch, aber yup mein Code funktioniert normal – hammadspark

0

das ist die Lösung, die ich verwendet:

 String headerSTR = "Id,Name,Color,Age"; 
     JavaRDD<String> header = sc.parallelize(Arrays.asList(headerSTR)); 


     String currentFile = "C:/Users/pc/Desktop/source.csv";   

     JavaRDD<String> csvFileC = c.textFile(currentFile).subtract(header); 

     JavaPairRDD<Integer, String> pairsC = csvFileC.mapToPair(new keyData()).sortByKey(true).cache(); 

und i modifiziert, um die keyData Funktion genau wie @Matthias Kricke

empfohlen
Verwandte Themen