繁体   English   中英

在Apache Spark中排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM