Java 理解apachespark过滤器转换行为

Java 理解apachespark过滤器转换行为,java,apache-spark,filter,Java,Apache Spark,Filter,我在JavaRDD中有一个项目列表,其中每个项目都是一个日期(Java日历)。现在,我想过滤所有小于给定日期的日期。这是我的密码: 主要 在将计算分布到该变量的过程中,到底发生了什么?也因为结果显然是正确的,但我在更复杂的情况下调试这段代码时遇到了麻烦。这对我来说很奇怪,在清除for循环中的过滤器日期之后,您如何获得日期?删除该行后,您的代码在meSorry中运行良好,这是一个复制/粘贴错误,one是要初始化的日历。实际上,代码对我来说也很好,但是我不能理解输出。代码对我来说很好,我的意思是我的

我在JavaRDD中有一个项目列表,其中每个项目都是一个日期(Java日历)。现在,我想过滤所有小于给定日期的日期。这是我的密码:

主要


在将计算分布到该变量的过程中,到底发生了什么?也因为结果显然是正确的,但我在更复杂的情况下调试这段代码时遇到了麻烦。

这对我来说很奇怪,在清除
for
循环中的
过滤器日期之后,您如何获得日期?删除该行后,您的代码在meSorry中运行良好,这是一个复制/粘贴错误,
one
是要初始化的日历。实际上,代码对我来说也很好,但是我不能理解输出。代码对我来说很好,我的意思是我的输出总是给我预期的filterDate。您的问题不会出现,因为meI在我的集群上运行了相同的代码。在集群上,输出正常。当我在本地机器上运行它时,仍然可以得到输出。真奇怪。更有趣的是,如果我在
call()
方法中的第一个系统之后添加另一个check作为
Sytem.out.println(filteringDate.getTimeInMillis()+”:“+1451642400000l)
,它总是以毫秒为单位打印正确的时间,而第一个系统打印错误的日期,如图所示。我以为这是时区的问题,但显然不是。我真的很不安。
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("Date comparison test")
            .setMaster("local[4]").set("spark.executor.memory", "1g");
        JavaSparkContext sc = new JavaSparkContext(conf);

        // initializes a filter date to 01/01/2016 at 10:00:00
        Calendar filterDate = Calendar.getInstace();
        filterDate.clear();
        filterDate.setTimeInMillis(1451642400000l);

        // initializes an array of 40 calendars, in which every date
        // is 1 hour later than the previous, starting from
        // 01/01/2016 at 08:00:00
        ArrayList<Calendar> calendarArray = new ArrayList<>();
        // milliseconds corresponding to 01/01/2016 at 08:00:00
        long initial = 1451635200000l;
        for(int i=0; i < 40; ++i) {
            Calendar one = Calendar.getInstace();
            one.clear();
            one.setTimeInMillis(initial);
            calendarArray.add(one);
            initial += 3600000;
        }

        JavaRDD<Calendar> rdd = sc.parallelize(calendarArray);
        JavaRDD<Calendar> rddFiltered = rdd.filter(new FilterTest(filterDate));
        System.out.println("RDD SIZE " + rddFiltered.count());
        sc.close();
}
public class FilterTest implements Function<Calendar, Boolean> {

private static final long serialVersionUID = -3134317182912968444L;
private final Calendar filteringDate;

public FilterTest_(Calendar filteringDate) {
    super();
    this.filteringDate = filteringDate;
}

@Override
public Boolean call(Calendar arg0) throws Exception {
    // getStandardFormattedDate just prints a date in a given format
    System.out.println(TimeUtils.getStandardFormattedDate(arg0) + " - " + TimeUtils.getStandardFormattedDate(filteringDate));
    if(arg0.before(filteringDate)) {
        return false;
    }
    else { 
        return true;    
    }
  }
}
Sat, 01 Jan 2016 08:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 01 Jan 2016 08:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 08:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 02 Jan 2016 15:00:00 - Fri, 01 Jan 2016 09:00:00
Fri, 01 Jan 2016 09:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 02 Jan 2016 15:00:00 - Fri, 01 Jan 2016 09:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 02 Jan 2016 20:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 02 Jan 2016 07:00:00
Sat, 02 Jan 2016 17:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 11:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 02 Jan 2016 21:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Sat, 01 Jan 2016 22:00:00
Fri, 01 Jan 2016 22:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 01 Jan 2016 22:00:00 - Fri, 01 Jan 2016 12:00:00
Fri, 01 Jan 2016 23:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 23:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 23:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 02 Jan 2016 00:00:00
Sat, 02 Jan 2016 00:00:00 - Fri, 01 Jan 2016 19:00:00
Fri, 01 Jan 2016 13:00:00 - Fri, 02 Jan 2016 10:00:00
Sat, 01 Jan 2016 10:00:00 - Sat, 01 Jan 2016 14:00:00
Sat, 02 Jan 2016 01:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 02 Jan 2016 11:00:00
Sat, 01 Jan 2016 14:00:00 - Fri, 02 Jan 2016 11:00:00
Sat, 02 Jan 2016 11:00:00 - Fri, 01 Jan 2016 15:00:00
Fri, 01 Jan 2016 15:00:00 - Sat, 02 Jan 2016 10:00:00
Sat, 02 Jan 2016 02:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 02 Jan 2016 15:00:00 - Sat, 02 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 10:00:00 - Fri, 01 Jan 2016 10:00:00
Fri, 01 Jan 2016 12:00:00 - Fri, 01 Jan 2016 22:00:00
Sat, 01 Jan 2016 17:00:00 - Fri, 02 Jan 2016 10:00:00
Fri, 01 Jan 2016 22:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 02 Jan 2016 13:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 01 Jan 2016 10:00:00 - Fri, 01 Jan 2016 10:00:00
Sat, 02 Jan 2016 23:00:00 - Fri, 01 Jan 2016 10:00:00