2016-06-28 9 views
0

私はスパークするために新しいです、私はそれをソートし、キーを比較することができるJavaPairRDDを作成したい、コードのサンプルを示すように、 JavaPairRDDしかし、関数sortByKey()を使用した後、私はそれが整数としてではなく文字列としてキーを扱うことに気づいた。例えばどのようにintキーを使用してペアrddを作成する

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

pairsCは、以下の要素が含まれている場合:

(1など)、(2、あなた)、(12、ER)、(3、銅)、(22、HHをHH、22(、)、2(、)えー、12(、)として、

(1あなたに:)

のでsortByKey()を使用して、もう一度それを表示した後、私はそれが好き見つけます)、(3、cu)

それはない整数として文字列としてキーを扱う意味するが、以下のように、私が求めて結果が

(1、など)、(2、あなたに)、(3、銅) 、(12、er)、(22、hh)

どのように私はintとして私のキーを扱うことができますか?詳細は 、これは私があなたのコードでも動作します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]+",", "")); 
    } 

答えて

0

にRDDを変換するために使用する機能キーデータはありますか? callの返品タイプはTuple2<Integer, String>ですが、新規のTuple2を登録する場合はTuple2<String, String>です。この問題を解決するには、あなたが簡単なあなたの文字列が整数に変換することができます:

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

さらにあなただけの最初の分割要素の整数を持っていることを確認してください。通常、ファイルのヘッダーは削除するか、存在する場合はスキップして、NumberFormatExceptionsを避けなければなりません。

ただし、コンパレータにsortByKeyを指定すると、詳細についてはJavaDocsを参照してください。これは次のようになります:

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

がすることができません推奨まったく同じキーデータ機能を修正しましたtuple2 を返すように呼び出しを修正しますか?もしそうなら、それを行う方法よりも?私は整数として鍵を必要とするので – hammadspark

+0

はい、それは私の答えを少し拡張しました。 –

+0

そしておそらくそれは非論理的ですが、私のコードは正常に動作します – hammadspark

0

これは私が使用したソリューションです。

 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(); 

を、私は@Matthias Krickeが

関連する問題