将类对象转换为Java RDD

时间:2017-01-16 01:40:40

标签: java apache-spark rdd

我有一个pojo- AnalyticsModel,我有一个循环,我为pojo创建对象。每次创建对象时,我都会保存到名为AnalyticsModelList的列表中。然后在退出循环之后,我将列表转换为RDD。以下是我的代码:

do {    
       AnalyticsModel analyticsObj = new AnalyticsModel(time, columnName, aggrResult);
       analyticsList.add(analyticsObj);
    }while (cal.getTimeInMillis() <= endDate);

    JavaRDD<AnalyticsModel> analyticsRdd = sc.parallelize(analyticsList);

不管是添加到列表然后将其转换为RDD,还是可以直接将对象作为RDD。虽然有人可以指导我吗?我对Spark很新。

由于

1 个答案:

答案 0 :(得分:0)

有一种方法。但如果您的AnalyticsModel个对象很少,那么您所做的工作就可以了。(您不必通过以下解决方案让您的生活变得复杂)。 如果您要创建大量AnalyticsModel个对象,请考虑以下解决方案。

此类每次调用生成一个AnalyticsModel个实例。

public class AnalyticsModelGenerator implements FlatMapFunction<String, AnalyticsModel> {

    private final Long endDate;
    private final Calendar cal;

    public AnalyticsModelGenerator(Calendar cal, Long endDate) {
        this.cal = cal;
        this.endDate = endDate;
    }
    @Override
    public Iterable<AnalyticsModel> call(String dummyInput) throws Exception {
        return new Iterable<AnalyticsModel>() {
            @Override
            public Iterator<AnalyticsModel> iterator() {
                return new AMIterator(cal, endDate);
            }
        }
    }

    private class AMIterator implements Iterator<AnalyticsModel> {
        private final Long endDate;
        private final Calendar cal;

        public AMIterator(Calendar cal, Long endDate) {
            this.cal = cal;
            this.endDate = endDate;
        }

        @Override
        public boolean hasNext() {
            return (cal.getTimeInMillis() <= endDate);
        }

        @Override
        public AnalyticsModel next() {
            return new AnalyticsModel(time, columnName, aggrResult);
        }
    }
}

下面的代码创建了AnalyticsModel个对象的RDD:

JavaRDD<String> initJavaRDD = jSparkContext.parallelize(new ArrayList<String>(){{add("dummyInput");}});
JavaRDD<AnalyticsModel> amJavaRDD = initJavaRDD.flatMap(new AnalyticsModelGenerator(cal, endDate));