我正在使用Java 8对Spark进行实验,以便对CSV文件进行一些分析。
我想按键计算元素总和。
我的RDD类型为JavaPairRDD<String, Iterable<Record>>
,我想将此RDD转换为JavaPairRDD<String, Integer>
,其中整数值是可迭代集合中所有元素的总和。
Record是一个简单的java POJO。
关于如何做到这一点的任何想法?
JavaPairRDD<String, Iterable<Record>> distinct = map
.filter(record -> record.circonference > 170)
.groupBy(record -> record.espece)
.distinct();
我的POJO课程
public static class Record implements Serializable {
private String geoPoint;
private float circonference;
private String addresse;
private float hauteur;
private String espece;
private String variete;
private String datePlantation;
答案 0 :(得分:0)
假设您的输入RDD名为rdd,
rdd.mapValues(records -> {
Integer ret = 0;
for(Record r: records) {
ret += Math.round(ret.circonference);
ret += Math.round(ret.hauteur);
}
return ret;
})
我不确定你为什么要将所有浮点数加到一个整数中,但这应该或多或少地为你做。 mapValues
允许我们将一个函数应用于键/值对的值部分,同时保持相同的键,因此它非常适合此类问题。
答案 1 :(得分:0)
我自己使用mapToPair转换解决。
我们可以将第二个元素映射到可迭代集合的大小,如下所示:
JavaPairRDD<String, Iterable<Record>> distinct = map
.filter(record -> record.circonference > 170)
.groupBy(record -> record.espece)
.mapToPair(t -> new Tuple2<String,Integer>(t._1, Lists.newArrayList(t._2).size()))