我有一个CSV数据集,其中包含以下列(Accident_Id,Date,Area)和数百行。我想要实现的是按区域列分组到可能的唯一组中并查找每个组的计数。
我知道如何使用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并使用它来计算其键。
以下仅假设带有逗号分隔记录的String 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();