2014-09-25 47 views
0

我正在致力於SPARK。我的目標是讀取文件中的行,並根據散列進行排序。我瞭解到我們獲得的文件爲RDD。那麼是否有一種方法可以迭代RDD,以便我可以一行一行讀取。所以我想能夠將其轉換爲Iterator類型。遍歷SparkRD中的JavaRDD <String>

我只限於在它上面應用一些轉換函數來使它工作。遵循Spark的懶惰執行概念

到目前爲止,我已經嘗試了以下轉換技術代碼。

SparkConf sparkConf = new SparkConf().setAppName("Sorting1"); 

    JavaSparkContext ctx = new JavaSparkContext(sparkConf); 


    JavaRDD<String> lines = ctx.textFile("hdfs://localhost:9000/hash-example-output/part-r-00000", 1); 




    lines = lines.filter(new Function<String, Boolean>() 
       { 
        @Override 
        public Boolean call(String s) { 
        String str[] = COMMA.split(s); 
        unsortedArray1[i] = Long.parseLong(str[str.length-1]); 
        i++; 
        return s.contains("error"); 

        } 
       }); 

    lines.count(); 
    ctx.stop(); 
    sort(unsortedArray1); 
+0

你想實現與上面的代碼是什麼?什麼是unsortedArray?你想排序行嗎?或行內的值? – Averman 2014-09-26 07:41:46

+0

@Averman我想要在數組中逐行存儲。然後將其發送到排序功能 – Koneri 2014-09-26 10:27:39

+0

因此,排序是否在火花之外? – Averman 2014-09-26 12:11:18

回答

1

如果要排序的RDD字符串,你可以使用takeOrdered功能

takeOrdered
java.util.List的takeOrdered(INT NUM, 了java.util.Comparator COMP)
返回由指定的 比較器[T]定義的此RDD中的前K個元素並維護順序。
參數:NUM - 的 頂端元件的數量返回排版 - 定義順序
返回比較:頂端元件

takeOrdered
的java的陣列。 util.List takeOrdered(int num)
使用T的自然順序返回此RDD中的第一個K 元素,同時保持 的順序。
參數:NUM - 頂級元素的數量返回
返回:頂級元素的數組

,所以你可以做

List<String> sortedLines = lines.takeOrdered(lines.count()); 
ctx.stop(); 

因爲RDD分佈和shuffeled每個轉型,它還挺當它仍然處於RDD形式時無用於排序,因爲當分類的RDD轉換時,它將被洗牌(cmiiw)

但是看一看JavaPairRDD.sortByKey()

0

儘量收集():

List<String> list = lines.collect(); 
Collections.sort(list);