![](/img/trans.png)
[英]Sorting an RDD in Apache Spark using mapPartitions and reduce
[英]Sorting in Apache Spark
我是Apache Spark的新手,正在从HDFS目录读取文件,然后根据条件进行过滤和排序。
我在hdfs目录中有两个文件第一个文件包含如下数据
Name:xxxx,currenttime:[timestamp],urlvisited:[url]
包含以下信息的第二个文件
Name:xxxx,currenttime :[timestamp],downloadfilename:[filename]
首先,我根据名称过滤数据,然后使用逗号分割数据,然后使用currenttime字段对数据进行排序
到目前为止,我已经尝试过
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import scala.Tuple2;
public class SampleVisit {
public static void main(String[] args) {
final String name = args[0];
SparkConf sparkConf = new SparkConf().setAppName("sample");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
JavaRDD<String> lines = ctx.textFile("hdfs://localhost:9000/sample/*/",1);
JavaRDD<String> filterdata = lines.filter(new Function<String, Boolean>() {
@Override
public Boolean call(String s) {
return s.contains("Name:" + name);
}
});
//Returning all other values as one fields and currenttime as another field
JavaRDD<Tuple2<String,String>> stage2 = filterdata.map(new Function<String, Tuple2<String,String>>() {
public Tuple2<String, String> call(String s) throws ParseException {
String [] entries = s.split(",");
return new Tuple2(s[0]+","+s[2], s[1]);
}
});
List<Tuple2<String,String>> sorted = stage2.takeOrdered(100, new CompareValues()) ;
JavaRDD<Tuple2<String,String>> finale = ctx.parallelize(sorted);
finale.coalesce(1, true).saveAsTextFile("hdfs://localhost:9000/sampleout");
}
}
我的CompareValues.java如下所示
public class CompareValues implements Comparator<Tuple2<String,String>>, Serializable {
@Override
public int compare(Tuple2<String, String> o1, Tuple2<String, String> o2) {
long first = Long.valueOf(o1._2);
long second = Long.valueOf(o2._2);
Date firstDate = new Date(first);
Date secondDate = new Date(second);
return secondDate.compareTo(firstDate);
}
}
当我使用Name值作为参数运行此文件时,所有文件都按预期运行,但是结果返回的数据中第一个文件值是有序的,然后第二个文件值是有序的,但是我想要两个文件值都按有序的结果方式有人可以帮助我吗?
我认为您的问题来自将shdd shuffle=true
与RDD合并。 这意味着使用哈希分区程序对RDD进行混洗,并将每个项目发送到适当的分区。 因此,这些项目在分区内排序,但通常不是这样。 将其保存到文件时,每个分区都将写入一个单独的文件,以允许并发写入。
如果要在所有分区之间对结果进行排序,则需要设置一个分区程序,以确保所有“关闭”项都在同一分区中。
请参阅此处的“ 数据分区”一章以获取更多说明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.