我有一个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很新。
由于
答案 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));