首页 > 解决方案 > JavaRDD 等价于 GROUP BY

问题描述

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

我知道如何用 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();

标签: javaapache-sparkrdd

解决方案


您可以简单地制作一对 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();

推荐阅读