使用Spark API聚合Iterable值

时间:2015-09-15 01:18:50

标签: apache-spark rdd

我正在使用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; 

2 个答案:

答案 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()))