JavaRDD equivalent to GROUP BY



我有一个CSV数据集,其中包含以下列(Accident_Id,日期,面积)和数百行。我想要实现的是按"区域"列分组到可能的唯一组中,并找到每个组的计数。

我知道如何使用SQLContext执行此操作,但我不确定如何使用JavaRDD及其操作(map,reduce等)实现

SparkConf conf = new SparkConf().setAppName("test").setMaster("local[2]");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> data = sc.textFile(pathToCSV);
...
sqlContext.sql("SELECT COUNT(Area) FROM my_table GROUP BY Area").show();

您可以简单地创建一个对RDD并使用它来按其键计数。

以下仅假设具有逗号分隔记录的字符串RDD:

Map<String, Long> areaCounts = 
    data.mapToPair(s -> new scala.Tuple2<>(s.split(",")[2], 1L)).countByKey();

这将为您提供area -> count地图。

如果您希望手动实现归约逻辑,可以使用reduceByKey

Map<String, Long> areaCounts = 
    data.mapToPair(s -> new scala.Tuple2<>(s.split(",")[2], 1L))
            .reduceByKey((l1, l2) -> l1 + l2).collectAsMap();

最新更新