我正在开发 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);
答案 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)
答案 1 :(得分:1)
尝试收集():
List<String> list = lines.collect();
Collections.sort(list);