JavaRDD相当于GROUP BY

时间:2019-01-28 16:00:49

标签: java apache-spark rdd

我有一个CSV数据集,其中包含以下列(Accident_Id,Date,Area)和几百行。我要实现的是将“面积”列分组为可能的唯一组,然后找到每个组的计数。

我知道如何使用SQLContext做到这一点,但是我不确定如何使用JavaRDD实现它以及它的操作(映射,缩小等)

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();

1 个答案:

答案 0 :(得分:1)

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