迭代Spark </string>中的JavaRDD <string>

时间:2014-09-25 07:50:51

标签: apache-spark

我正在开发 SPARK 。我的目标是从文件中读取行并根据哈希对它们进行排序。我知道我们将文件作为 RDD 的行。那么有没有办法可以迭代这个RDD,这样我就可以逐行读取。所以我希望能够将其转换为Iterator类型。

我是否仅限于在其上应用一些转换功能以使其正常工作。遵循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);

2 个答案:

答案 0 :(得分:2)

如果要在RDD中对字符串进行排序,可以使用takeOrdered函数

  

takeOrdered
java.util.List takeOrdered(int num,                               java.util.Comparator comp)
返回指定的RDD中的前K个元素   比较器[T]并维护订单。
  参数:num - 数量   返回comp的顶部元素 - 定义顺序的比较器
  返回:顶部元素数组

  

takeOrdered
java.util.List takeOrdered(int num)
返回第一个K   来自此RDD的元素使用T的自然顺序进行维护   命令。
参数:num - 要返回的顶部元素的数量   
返回:顶部元素数组

所以你可以做到

List<String> sortedLines = lines.takeOrdered(lines.count());
ctx.stop();
由于RDD是针对每次转换进行分配和转移的,因此当它仍处于RDD格式时排序是有用的,因为当RDD转换后,它将被洗牌(cmiiw)

但请查看JavaPairRDD.sortByKey()

答案 1 :(得分:1)

尝试收集():

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